次の方法で共有


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

質問

2014年4月21日月曜日 5:19

お世話になります。

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

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

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

下記はリソースファイルで、「実線」と記述されており、調べてみるとshift-jisコードでした。

IDD_UNIRESOURCE_DIALOG DLGINIT
BEGIN
    IDC_COMBO1, 0x403, 5, 0
0xc08e, 0xfc90, "\000" 

すべての返信 (13)

2014年4月22日火曜日 7:37 ✅回答済み

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

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


2014年4月21日月曜日 6:29

まず、ダイアログリソースのフォントはどうなってますでしょうか。
たとえば、下のリソースの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日月曜日 7:05

ご返事ありがとうございます。

MS UI Gothic

でした。

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

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

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

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

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


2014年4月21日月曜日 8:01

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

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

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


2014年4月21日月曜日 8:25

ご返事ありがとございます。

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

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

「晴天;曇り;雨;」

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

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


2014年4月21日月曜日 8:42

>コンボボックスのプロパティウィンドウのの「Data」プロパティに
>「晴天;曇り;雨;」

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

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

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

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


2014年4月21日月曜日 12:40

ご返事ありがとうございます。

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


2014年4月22日火曜日 1:04

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

 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
 #pragma code_page(932)

の部分ですね。


2014年4月22日火曜日 3:45

新規のプロジェクトでも、文字化けしております。(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日火曜日 4:08

codepage(1200)はUTF-16LEですが、それは希望した内容でしょうか。
また、もしその状態でだめなら、932に戻すしかないと思うのですが、
どうなんでしょう。


2014年4月22日火曜日 6:16

新規作成したプロジェクト(1200)、既存のプロジェクト(932)です。

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

仕様なのでしょうか。


2014年4月22日火曜日 9:02

ご返事ありがとうございます。

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

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

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


2014年4月26日土曜日 12:16

他の閲覧者のためにも記載しておきますが、これは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はすでにメンテナンスモードに限りなく近い状態なので、今後もこういった仕様レベルで広範囲に影響を与える問題に関しては修正されることはないと思われます。

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