サンプルコードがスパムフィルタに引っかかったらしく削除されたのでgistに上げなおしました。
ICUを使って文字を分割すると異字体セレクタなどを考慮した文字単位に分割できます。
2024-04-13 ICUのリンクが空になっていたのを修正
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
MFCのCStringから1文字づつ取り出してCStringArrayに入れようとしています。
CStringにサロゲートペア/結合文字(つまり2バイト以上の文字)が入っていると, CString::GetLength/CString::Mid/CString::GetAtが上手く動かないので、
これらの文字が入っているCStringから1文字づつ文字数分取り出す方法をご教授ください。
環境:Windows11/VS2019 C++ です。
よろしくお願いします。
やっているのはこんな感じです。
for (int i = 0; i < CString.GetLength(); i++)
CStringArray.Add( CString( CString.GetAt(i) ) );
有効な情報ありがとうございました。
今回は焦点を絞って質問したのですが、開発しているプログラムでは2バイト以上の文字を考慮してなくて CStringからGetLength()で文字数を得て、Mid(で1文字ずつ処理しているような箇所が数百か所ありました。
今のところ C++CLRを使うとコードのイメージがだいぶ変わるのと、 icuは自分で作ったソースとあまり変わらないそうなので、 CStringの派生クラスでも作って問題となっているGetLength/Mid/GetAtを2バイト以上対応用に別に作る方向で検討しています。 (icuは良さそうなので使用するかもしれません)