MFC/C++ でCStringにユニコードの3バイトや4バイト文字が入っている場合、1文字づつ取り出して CStringArrayに入れたい

MFCプログラマー 141 評価のポイント
2024-04-10T02:39:44.05+00:00

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) ) );

C++
C++
C プログラミング言語の拡張機能として作成された高レベルの汎用プログラミング言語。低レベルのメモリ操作機能に加えて、オブジェクト指向、汎用、関数型の機能を備えています。
23 件の質問
{count} 件の投票

承認済みの回答
  1. gekka 9,916 評価のポイント MVP
    2024-04-11T03:42:48.67+00:00

    サンプルコードがスパムフィルタに引っかかったらしく削除されたのでgistに上げなおしました。

    ICUを使って文字を分割すると異字体セレクタなどを考慮した文字単位に分割できます。


    2024-04-13 ICUのリンクが空になっていたのを修正

    1 人がこの回答が役に立ったと思いました。

2 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Deleted

    この回答は当社の行動規範に違反したため削除されました。 アクションを実行する前にこの回答を手動で報告したか、自動検出機能により特定しました。 詳細については、当社の行動規範を参照してください。


    コメントはオフになっています。 詳細情報

  2. MFCプログラマー 141 評価のポイント
    2024-04-12T01:02:38.4466667+00:00

    有効な情報ありがとうございました。

    今回は焦点を絞って質問したのですが、開発しているプログラムでは2バイト以上の文字を考慮してなくて CStringからGetLength()で文字数を得て、Mid(で1文字ずつ処理しているような箇所が数百か所ありました。

    今のところ C++CLRを使うとコードのイメージがだいぶ変わるのと、 icuは自分で作ったソースとあまり変わらないそうなので、 CStringの派生クラスでも作って問題となっているGetLength/Mid/GetAtを2バイト以上対応用に別に作る方向で検討しています。 (icuは良さそうなので使用するかもしれません)

    0 件のコメント コメントはありません

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。