1

古いVC++6.0 MFCプログラムでUTF8を読み取ってTextBoxまたはMessageBoxに表示するにはどうすればよいですか?できれば、現在そこに書き込まれているファイルの読み取りと表示を中断せずに(かなり実質的に)。

CString strStrに行を読み込んでから、次のコードを使用しました。

int nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,strStr,1024,0,0);
wchar_t * pWCMessage = new wchar_t[ nLengthNeeded ];

MultiByteToWideChar(CP_UTF8,0,strStr,1024,pWCMessage,nLengthNeeded);

nLengthNeeded = MultiByteToWideChar(CP_UTF8,0,"Error Title",50,0,0);
wchar_t * pWCTitle = new wchar_t[ nLengthNeeded ];
MultiByteToWideChar(CP_UTF8,0,"Error Title",50,pWCTitle,nLengthNeeded);

MessageBoxW(NULL,pWCMessage,pWCTitle,MB_ICONINFORMATION);

どうやってテキストボックスに入れるかはまだわかりませんが、とにかくそうする必要はないことがわかりました。

4

4 に答える 4

2

これは役に立たないように感じますが、これは出発点です... 「うまくいかない」と仮定しています。またはあなたが望むものをあなたに与えないかもしれません。

MultiByteToWideChar(CP_UTF8, ...) を使用して utf16 に変換し、それらの関数の W バージョンを呼び出す (またはプロジェクトに UNICODE/_UNICODE を定義する) のはどうですか。

それが MessageBox で機能することはわかっていますが、テキスト ボックスが Unicode をサポートしていないとは思えません。

出力を UTF8 に戻す必要がある場合は、WideCharToMultiByte() を使用してください。

于 2009-01-13T17:47:04.300 に答える
0

あなたのアプリは Unicode です。はいの場合、Stefan の回答にフォールバックします。

MyDisplayableUtf16String = MultiByteToWideChar(CP_UTF8, MyUtf8String,...)

それほど単純ではないと思います。あなたのアプリは ANSI です。まず、上記のように文字列を UTF16 に変換する必要があります。次に、ボトルネックがあります。UTF8 文字列には、現在のシステム コードページ (別名「非 Unicode アプリケーションの言語」) 以外の文字が含まれていますか? そうでない場合は、次を使用して UTF16 文字列をシステム ロケールに変換します。

MyGoodOldAnsiString = WideCharToMultiByte(CP_ACP,MyUtf16String,...)

(または などの ATL/MFC マクロのいずれかを使用しますW2A(MyUtf16String))

これで完了です。

そうしないと、文字列を ANSI に変換できません。つまり、ANSI テキスト ボックスまたはメッセージ ボックスに文字列を表示しようとすると、非常に苦労することになります。

Joe が指摘したように、メッセージ ボックスにテキストを表示するには、

MessageBoxW(...,MyDisplayableUtf16String,...)

末尾の W は、API の Unicode (UTF16) バージョンを示します。

ただし、テキスト ボックスに文字列を表示するのは難しいままですCreateWindowExW()。テキストボックスの親ウィンドウ (ダイアログ、フレーム?) が Unicode ウィンドウでない場合、これは機能しないと思います。

于 2009-01-13T19:33:36.520 に答える
0

を見てみましょう:

widechartomultibyteおよびより一般的な情報については

問題が発生した場合は、必ずコードを投稿してください。私がそれをしてからしばらく経ちましたが、少しトリッキーだったのを覚えています。

于 2009-01-13T17:37:05.287 に答える
0

最初に API MultiByteToWideCharを使用して utf8 文字列をワイド文字列に変換し、codepage パラメータに CP_UTF8 を渡します。アプリケーションが _UNICODE を定義してコンパイルされている場合、ワイド文字列をテキスト ボックスに渡すことができるようになりました。

ただし、アプリケーションが MBCS アプリケーションとしてコンパイルされている場合は、CP_ACP を codepage パラメーターとして渡し、 WideCharToMultiByteを使用してワイド文字列を MBCS に戻す必要があります。

于 2009-01-13T17:50:36.930 に答える