ウィンドウキャプションのUnicode文字
-
03-07-2019 - |
質問
キリル文字または日本語の文字を使用してウィンドウキャプションを設定するのに問題があります。疑問符またはランダムなゴミが表示されますが、必要なテキストは表示されません。異なるエンコーディング、SetWindowText()、SetWindowTextW()、SetWindowTextA()などを使用してみました。 SetWindowText()に文字列リテラルを渡すことで機能させることさえできません。
Windowsのインストールには必要なものがすべて含まれているようです。たとえば、Internet ExplorerやFirefoxでは、キリル文字と日本語のキャプションが正しく表示されます。だから、正しいエンコーディング/メソッドの組み合わせを見つけられないと確信しています。提案はありますか?
解決
SetWindowText()
?アプリケーションをUnicodeとしてコンパイルしましたか?そうでない場合、SetWindowText()は SetWindowTextA()
と同等であり、現在のシステムロケールに限定されます(別名「非Unicodeアプリケーションの言語」)。
また、ウィンドウをどのように作成しましたか? CreateWindowExW()
などの明示的にUnicode対応のAPIを使用していますか?そうでない場合は、プログラムがUnicodeとしてコンパイルされていることを確認してください。
プログラムがUnicodeとしてコンパイルされていない場合、「Unicode以外のアプリケーションの言語」を変更することをお勧めします。 CP / Regionalオプションで。再起動が必要です。またはもっと簡単: MS AppLocale を使用して、キリル文字のシステムロケールをシミュレートします
他のヒント
(推測で)あなたが持っている問題は、アプリケーションのトップレベルのフレームウィンドウがANSIウィンドウであることです。内部では、(CreateWindow()またはCreateWindowEx()を使用して)ウィンドウを作成するときに、ウィンドウクラスを指定する必要があります。このウィンドウクラスは、デフォルトでANSIメッセージまたはUnicodeメッセージを受け入れるかどうかなど、ウィンドウのプロパティを決定します。次に、これは、RegisterClassExA()またはRegisterClassExW()を呼び出してウィンドウクラスを登録するかどうかによって設定されます。
ほとんど確実に起こるのは、トップレベルウィンドウのクラスがRegisterClassExA()で登録されていることです。これは、ウィンドウのデフォルトのウィンドウプロシージャが、メッセージ内のすべてのUnicode文字列をANSIに変換してから処理することを意味します。したがって、疑問符と奇数文字はどこにでもあります。
これらすべてに対する最も簡単な解決策は、アプリケーション全体をUnicodeにすることです(通常は_UNICODEを定義することによって行われます)。もう1つの方法は、RegisterClassEx()が呼び出されている場所を特定し、RegisterClassExW()にすることです。これにより、他のメッセージでANSI / Unicodeの問題が発生する可能性がありますが、(少なくとも理論的には)動作するはずです。もちろん、それが問題であれば、どちらの方法でもWindows 9Xが壊れます。
これらすべてが恐ろしく複雑に聞こえるなら、あなたは間違っていません...
_UNICODEを定義してアプリケーションをコンパイルする必要があります。それ以外の場合、すべてのウィンドウはまだutf-16ではなくMBCSであるため、コードページが一致しない場合、キリル文字または日本語文字を表示できません。