4

ユニコードをロードするのがやや骨の折れる点であることは知っていますが、他の人に提示された解決策を私の特定の問題に適用する方法がわかりません。

画面にテキストをレンダリングできる Win7/C++/DirectX9 GUI ライブラリがあります。西ヨーロッパ言語でしか使用されていないため、これまで問題が発生したことはありません. 今、ハンガリー語で使わなければならないのですが、頭痛の種です! 私の特定の問題は、その言語で見つかった特殊文字をロードすることです。

この例を見てみましょう。FELNŐTTEKNEK は、成人を意味します。

この文字列をアプリにハード コードすると、正しくレンダリングされます。

guiTitle->SetText( L"FELNŐTTEKNEK" );

これにより、文字列が std::wstring として格納され、ID3DXFont::DrawTextW() でレンダリングされます。また、私が選んだフォント、Futura CE が特殊文字 (CE = 中央ヨーロッパ言語) をレンダリングできることも証明しています。

ここまでは順調ですね。次に、テキスト ファイルからテキストを読み込めるようにしたいだけです。大きな問題ではない。しかし結果はイマイチ!特別な Ő は別の文字に置き換えられます。主に Å または Å のような 2 つの文字です (2 番目の文字は通常印刷できません)。

入力テキストファイルがUTF-8としてエンコードされていることを確認し、素朴にロードしようとしています:

wifstream f("data/language.ini");
wstring w;  
getline( f, w );    
guiTitle->SetText( w );

どういうわけか、私はまだそれをスクランブルしています。UTF-8 として読み込みますか? これを確実にする方法はありますか?テキストエディタに表示されるように、テキストを含むワイド文字列があることを確認する必要があります。

最も感謝して受け取った支援。

4

3 に答える 3

7

忘れてくださいwifstream、それを機能させるのは難しすぎます。行う:

ifstream f(L"data/language.ini");
string str;  
getline( f, str );
guiTitle->SetText( utf8_to_utf16(str).c_str() );

そして、MultiByteToWideCharを実装するために使用しますutf8_to_utf16

https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmfulも参照してください。

于 2011-08-15T14:37:39.957 に答える
3

DrawTextW は UTF-16 を想定しています。

あなたがしているのは、各UTF-8コード単位(バイト)をゼロパディングによって16ビット値に変換することです.UTF-8がASCIIサブセットの文字のみを含む場合にのみ、これはUTF-8をUTF-16に正しく変換しますユニコード。

UTF-8 から UTF-16 に正しく変換する必要があります。文字列を std::string (std::wstring ではありません) にロードし、その UTF-8 文字列を UTF-16 文字列に変換して、UTF-16 文字列を期待する API に渡します。

于 2011-08-15T14:54:25.197 に答える
-1

どこでも UTF-8 を使用し、必要な関数を自分で実装し (UTF-16 でも同様に行うことができます)、Windows API と通信するときにそれを UTF-16 に変換し直す (そして、Windows APIの問題を回避する方法を考えてみてください-結局のところ、UTF-16文字を指定しているため、とにかくすべて同じバグに遭遇します)、メリットのない余分な作業がかなり多いようです.

とにかく、「std::string を使用し、低レベルのメソッドを使用して UTF-16 に変換する」代わりに、API にその仕事を任せることができます (これは最高のパフォーマンスをもたらさない可能性があることに注意してください。Ray Chen はその方法についていくつかのシリーズを持っていました戻って - 新しいコンパイラがそれを修正してくれることを願っていますが、通常のファイルはほとんど重要ではありません)。

基本的にあなたはそれを行うことができます:

 std::wifstream src;
 src.imbue(std::locale("UTF-8")); // use correct encoding.
 src.open(file);

ライブラリがそれを行う可能性がある場合、なぜすべての作業を自分で行うのですか (MultiByteToWideChar を使用する必要がないときはいつでも幸運だと思います) - また、意図をより明確にします。

于 2011-08-15T15:06:37.307 に答える