- 締切済み
CString型 全角半角を意識せずに「1文字」ずつ取り出す
CString型の文字列に格納されている文字を1文字ずつ取り出したいです。 ただし半角なら1バイト単位で、全角なら2バイト単位で、という風に分離したいです。 半角だけなら、str[0] str[1]...という風に取り出せますが、 全角が混じっていると、1バイト目、2バイト目と分離されてしまいます。 その文字が半角か全角かを判断して、半角なら1バイト、全角なら2バイト同時に取り出すロジックを、下記のような感じの関数として作りたいです。 CString ripString(CString str,int index){ //ソースとなる文字列、n文字目 /*~処理~*/ return 文字列; } たとえば"あaいbうcえdおe"という文字列を入れると、 CString str="あaいbうcえdおe"; ripString(str,0) →結果 "あ" ripString(str,1) →結果 "a" ripString(str,2) →結果 "い" ripString(str,3) →結果 "b" ・ ・ ・ こういうことをするのに良い方法はありますか? 1バイトごとのそれぞれの文字自身が、 ・半角文字なのか ・全角文字の前1バイトなのか ・全角文字の後1バイトなのか これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kanokawa
- ベストアンサー率0% (0/0)
VC++6.0 をインストールするとき 種々の選択肢が出てきますが そのとき UNICODEを選択します そうするとCStringにたいする操作は自動的にバイト単位ではなくて 文字単位になります 特別な関数は必要としません ただしOSがUNICODEを持っていることが必要です たとえばWindowsXPだとデフォールトでOKですが Windows98ではそのままではだめです
- bluecampus
- ベストアンサー率66% (138/209)
単にキャストすればいいですよ。 _ismbbleadでも可能だと思いますが。 次の文字へポインタを進める関数_tcsinc(CharNext)を使った例です。 CString ripString(CString str, int index) { LPCTSTR pStart = str; for (int i = 0; i < index; ++i) { pStart = _tcsinc(pStart); // CharNextでも同様 } LPCTSTR pEnd = _tcsinc(pStart); // CharNextでも同様 TCHAR result[3]; const int len = pEnd - pStart; memcpy(result, pStart, len); result[len] = _T('\0'); return result; }
CStringって言ってるからVC++だと仮定するなら _ismbsleadと_ismbstrail
補足
ありがとうございます。VC6にてです。 教えていただいた_ismbslead()を使おうとしてみましたが引数がよく分からず、 調べていたところ見つけた「_ismbblead()」を使ってみたところ、 目的としていたことが8割がたできたようですが、一部取り逃がすようです。 (2バイトの先頭なのにそう判断してくれない) やはり、教えていただいた_ismbsleadを使うしか無いようです・・・ 引数が「const unsigned char*」となっていて、どのように入れれば良いかが分かりません。 int _ismbslead( const unsigned char *str, const unsigned char *current ); (ismbblead()のほうですと、単純に単体文字へのポインタ(char*型)を入れれば機能はしたのですが。) 同じように入れようとすると、 「char* をconst unsigned char*に変換できない」 という内容のコンパイルエラーが出ます。 詳細な使い方を教えていただけると幸いです。