none
リソースファイルの文字列のUNICODE化

    質問

  • お世話になります。

    VC6+MFCでアプリケーションを作成し、VC2010へプロジェクト移植し
    その時にマルチバイトからUNICODEへ対応しました。

    日本語OSの場合は問題なかったのですが、
    日本語OS以外で、リソースのダイアログのコンボボックスのリストに直接埋め込んだ日本語が、文字化けしていることが分かりました。

    方法があれば教えてください。

    下記はリソースファイルで、「実線」と記述されており、調べてみるとshift-jisコードでした。
    IDD_UNIRESOURCE_DIALOG DLGINIT
    BEGIN
        IDC_COMBO1, 0x403, 5, 0
    0xc08e, 0xfc90, "\000" 
    

    • 編集済み Brillia 2014年4月21日 6:28
    2014年4月21日 5:19

回答

  • 新規プロジェクトのDLGのコンボに対して、
    VSのリソースエディタからDataプロパティを設定した場合でも
    正しく表示されない、ということならあきらめるしかありまんね。
    瑕疵かどうかはわかりません。

    対症療法としては、
    DLGINITをFindRsouce(RT_DLGINIT)するのもばかばかしいので、
    DLGINITに相当するコードをOnInitDialog()に手で実装するしか
    ないかもしれませんね。

    • 回答としてマーク Brillia 2014年4月22日 9:02
    2014年4月22日 7:37

すべての返信

  • まず、ダイアログリソースのフォントはどうなってますでしょうか。
    たとえば、下のリソースのFONTは "MS Shell Dlg" フォントフェース名が
    指定されています。

     IDD_ABOUTBOX DIALOGEX 0, 0, 235, 161
     STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
     CAPTION "Nantara ni tuite"
     FONT 8, "MS Shell Dlg", 400, 0, 0x80
     BEGIN
         ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20
      :
      :

    フォントマッパーは指定されたフォントが存在しない場合、
    似たフォントをマップしてくれるという風に説明されていますが、
    どういう論理で選び出されるのかは知りません。

    ちなみに、このフォント名称"MS Shell Dlg"は実際には存在せず、
    OSさん、てきとーに表示してね。っな意味なのですが、
    もちろん実在するフェース名も指定できます。

    2014年4月21日 6:29
  • ご返事ありがとうございます。

    MS UI Gothic

    でした。

    VC2010で新規に作成したプロジェクトで、コンボボックスリストに
    リストの値をプロパティから設定したのですが、

    やはり、日本語OS以外は文字化けします。

    ・コンボボックスリスト以外の文字列は、文字化けしていない
    ・コンボボックスリストの文字列は、shift-jisコードで表現されている
    ・rcファイルは、utf16でエンコードされている

    をみると、「コンボボックスリストの文字列は、shift-jisコードで表現されている」が不思議です。

    一応、MS Shell Dlg"にしてみましたが、文字化けはしました。

    2014年4月21日 7:05
  • コンボボックスの初期化データ(配列)を使用しているわけですね。
    動作を確かめるために、親のDLGのInitdialog()で、

    1.当該コンボの全てのアイテムを削除する。
    2.当該コンボにUnicodeのアイテムを追加してみる
    3.当該コンボにMBCSのアイテムを追加してみる

    2.3.を複数個やってみて、2.ではOK、3.ではだめという結果なら。
    初期化データ(配列)もUnicodeにする必要があるのかもしれません。

    2014年4月21日 8:01
  • ご返事ありがとございます。

    説明が下手で申し訳ございません。

    コンボボックスのプロパティウィンドウのの「Data」プロパティに

    「晴天;曇り;雨;」

    と記述した場合に、日本語OS以外文字化けします。

    そして、rcファイルを見ると、shift-jisコードで記載されています。

    2014年4月21日 8:25
  • >コンボボックスのプロパティウィンドウのの「Data」プロパティに
    >「晴天;曇り;雨;」

    1.それをUnicode化する必要があるかも・・・

    という考えだったのです。で、

    2.それは、VSからはできない可能性があります。
    3.その場合、リースを直接編集する必要があるかもしれません。
    4.それは、ちょっと試してみるというほど簡単ではありません。
    5.なので、1.の仮説が正しいか、まずは実験してみましょう。

    ということですね。
    「5.」の結果から、原因が類推できるのなら、対策が打てるかもしれません。

    2014年4月21日 8:42
  • ご返事ありがとうございます。

    rcファイルにUnicode化した文字(コード)を入力してみましたが、
    アプリケーションがエラーで停止しました。

    2014年4月21日 12:40
  • ですか。では当該プロジェクトとは別に新しいプロジェクトを
    ウィザードで生成して、似たようなDLGとコンボボックスを作成し、
    初期化データ配列に同じ文字列群を設定して、正しく動作することを確認します。
    そのリソースと、当該プロジェクトのリソースとの違いを見てみてはどうでしょう。
    もちろん、DLGINITの部分と、対象のコンボボックス、DLGの部分ですね。
    リソースのコードページの設定も関係あるかもしれません。

     LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
     #pragma code_page(932)

    の部分ですね。

    2014年4月22日 1:04
  • 新規のプロジェクトでも、文字化けしております。(VS2010使用)

    また新規プロジェクトでは、rcファイル自体は、CodePage1200なのですが、

    コンボボックスの初期化データは、下記のようになっており、Shif-jisコードとなっています。

    「晴天;曇り;雨;」

    IDD_UNIRESOURCE_DIALOG DLGINIT
    BEGIN
        IDC_COMBO1, 0x403, 5, 0
    0xb090, 0x5693, "\000" 
        IDC_COMBO1, 0x403, 5, 0
    0xdc93, 0xe882, "\000" 
        IDC_COMBO1, 0x403, 3, 0
    0x4a89, "\000" 
        0
    END
    

    2014年4月22日 3:45
  • codepage(1200)はUTF-16LEですが、それは希望した内容でしょうか。
    また、もしその状態でだめなら、932に戻すしかないと思うのですが、
    どうなんでしょう。
    2014年4月22日 4:08
  • 新規作成したプロジェクト(1200)、既存のプロジェクト(932)です。

    しかし、結果は文字化けしており、コンボボックスの初期化リストは、shift-jisコードで保存されます。

    仕様なのでしょうか。

    2014年4月22日 6:16
  • 新規プロジェクトのDLGのコンボに対して、
    VSのリソースエディタからDataプロパティを設定した場合でも
    正しく表示されない、ということならあきらめるしかありまんね。
    瑕疵かどうかはわかりません。

    対症療法としては、
    DLGINITをFindRsouce(RT_DLGINIT)するのもばかばかしいので、
    DLGINITに相当するコードをOnInitDialog()に手で実装するしか
    ないかもしれませんね。

    • 回答としてマーク Brillia 2014年4月22日 9:02
    2014年4月22日 7:37
  • ご返事ありがとうございます。

    プログラムで実装することで、文字化け解消できそうです。

    ただ、結構多いので、コピペミス等などの不具合が怖いです。

    ありがとうございました。

    2014年4月22日 9:02
  • 他の閲覧者のためにも記載しておきますが、これはWin32リソーススクリプト仕様のバグというか欠陥です。
    2007年頃、この不具合がVC++2008ベータに対してMS Connectにて指摘されていますが、残念ながら修正されないことに決定されています。

    The Resource Edior in MFC applications corrupts non-ANSI text in Combo-Box

    リソーススクリプトのDLGINITブロックがUnicode未対応どころか開発環境OSのANSIコードページしか扱えない(つまり実質ASCIIしか使えないのと同然)という仕様になってしまっており、そのためVS IDE側で対応することも不可能で、修正するには仕様レベルの改変が必要なため、ユーザーコードの互換性維持のためにもガイドラインの範疇外とみなされて修正されないことになったものと思われます。

    Win32やMFCはすでにメンテナンスモードに限りなく近い状態なので、今後もこういった仕様レベルで広範囲に影響を与える問題に関しては修正されることはないと思われます。

    すでにこのスレッドでの議論がストップしているので、バグ報告や修正依頼をするつもりも最初からないのでしょうけれど……

    2014年4月26日 12:16