マルチバイト文字の扱い
1日、2日で完成させます。みたいなこと言っといていろいろつまずいてたりします。
以前同じようなソフトを作ったときはJavaScriptであったので文字列操作はほとんど気にせずに簡単にできた。半角文字「a」と全角文字「あ」が混ざっていても〜文字目の文字は?と聞けばなんの問題もなく文字調べることが出来た。
function saiten(){ text = "abcあいうえお"; input= "abcあいうえお"; while(i<text.length){ if(text.charAt(i) == input.charAt(j)){ //inputのi文字目がtextのi文字目と同じときー ++i; } } }
こんな感じ。とってもスマート
が、Cはそんな簡単じゃない。
MFCなのでCStringを使っていたのだが、
上のようにtext.GetAt(i)とやっても上手くいかない。
CStringはそのまま使うと1文字ずつわけるのではなく、1バイトずつわけてるようだ。
a・・・1バイト
あ・・・2バイト
だから、半角文字と全角文字が混ざってると文字数を数えるとき大混乱なのだ。
そのため、CStringをマルチバイトとして扱えるようにいろいろやってみた。
CStringにはUnicode版もあるっぽいからそっちを使えば簡単にできそう。
先にこっちのやりかたが見つけのでとりあえずこっちで。
CString text = "abcあいうえお"; CString input = "abcあいうえお"; setlocale( LC_ALL,"Japanese"); TCHAR *szText = new TCHAR[text.GetLength()+1]; TCHAR *szInput = new TCHAR[input.GetLength()+1]; TCHAR *pos_t = _tcscpy(szKadai,text); //入力文のチェック位置 TCHAR *pos_i = _tcscpy(szInput,input); //課題文のチェック位置 //採点 while(checked_num < (int)_tcsclen(input)){ if(_tcsnextc(pos_i) == _tcsnextc(pos_t)){ //正しいとき〜 pos_i = _tcsinc(pos_i); pos_t = _tcsinc(pos_t); } } delete[] szText; delete[] szInput;