dポイントプレゼントキャンペーン実施中!

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バイトなのか
これをプログラム的に判別する方法があればいいのですが・・・悩んでいます。

A 回答 (3件)

VC++6.0 をインストールするとき


種々の選択肢が出てきますが そのとき
UNICODEを選択します
そうするとCStringにたいする操作は自動的にバイト単位ではなくて
文字単位になります
特別な関数は必要としません
ただしOSがUNICODEを持っていることが必要です
たとえばWindowsXPだとデフォールトでOKですが
Windows98ではそのままではだめです
    • good
    • 1

単にキャストすればいいですよ。


_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;
}
    • good
    • 0

CStringって言ってるからVC++だと仮定するなら


_ismbsleadと_ismbstrail

参考URL:http://msdn.microsoft.com/ja-jp/library/scab1bx7 …

この回答への補足

ありがとうございます。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*に変換できない」
という内容のコンパイルエラーが出ます。

詳細な使い方を教えていただけると幸いです。

補足日時:2009/01/05 20:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A