英語での文字化け対策

解決


mizuki  2012-07-21 03:04:02  No: 42620

お世話になります。  (XP+D6Personal)
ButtonのCaptionなどを英語で書いているのですが英語圏(今のところNZ)で文字化けしていると連絡がありました。(FontはMS  Pゴシックにしてあります)  全部英語で作れば万国共通だと思っていたのですがどうもそうでないようです。これの対策を教えてください。  
また、現在は手元に英語版のPCがありませんが日本語OSでもテストする方法などありましたら教えてください。


DEKO  2012-07-21 04:48:54  No: 42621

英語版 Windows には "MS Pゴシック" 等はインストールされません。
(デフォルト状態の場合。東アジア向けの Windows だと最初からインストールされています)

...なので、文字化けを起こすようなら "MS Sans Serif" や "Tahoma" 等を使い、
ANSI_CHARSET を明示的に指定した方がいいと思います。

http://ht-deko.minim.ne.jp/ft0802.html#080224_04

# 2 バイトのアルファベット文字が混ざっているとかはないですよね?


mizuki  2012-07-21 22:55:27  No: 42622

DEKOさん  ご回答をありがとうございました。
MSPゴシックがインストールされていなければ文字化けするのは当たり前であることがわかりました。

現在次のようにして自動的に日本かそれ以外かを判別してボタン表示、メッセージなどを書き換えるようにしています。

       mylocale:=getuserdefaultlcid;
       if mylocale=1041 then Eng:=0 else Eng:=1;  

       if Eng>0 then begin
             //各種ボタン表示などの文字を英語に設定・・・・・
       end else begin
            //各種ボタン表示などの文字を日本語に設定・・・・・
       end;  

DEKOさんのサイトを拝見しましたが文中の”「実際のトコロどうすべきなのか?」というアイデア”  すなわちHowToが分かりませんでした。(またほとんどのリンクは切れていました)

それと日本仕様のOSでアメリカ環境を試す方法があったらお教えください。Delphi のバージョンによっても異なるところもあるようで難しそうですね?
よろしくお願いします。


DEKO  2012-07-23 22:02:28  No: 42623

> すなわちHowToが分かりませんでした。
Unicode 版 Delphi なら殆どの問題が解決するハズです。
Delphi に限らず ANSI アプリケーションは文字化けの問題が常に付きまといます。

結局の所、すべての Caption / Text プロパティの値と、
フォントの CharSet / Name を動的に切り替える仕組みが必要になると思います。

> 日本仕様のOSでアメリカ環境を試す方法があったらお教えください。
Windows 7 で "英語版" の XP Mode をインストールすれば、英語版 Windows XP を使う事ができます。
インストール方法を工夫すれば、日本語版 XP Mode と英語版 XP Mode を混在させられますよ。


mizuki  2012-07-24 23:50:57  No: 42624

DEKOさん  かなり具体的なご回答をありがとうございます。D6Personalという条件でできることをやってみたいと思います。

1.英語版モードでの動作テスト:
手元にあるWin7を調べたらHomePremiumでしたのでWin7でのテストは諦めます。(SKYPEなどで先方にテストしてもらいながら試そうかと思います)

2.ソフトでの対応:
>結局の所、すべての Caption / Text プロパティの値と、
>フォントの CharSet / Name を動的に切り替える仕組みが必要になると思います。
ボタンなど全オブジェクトについてFontNameの変更、文字列の変更をコツコツと進めたいと思います。(英語の時はMS Sans Serifに、日本語の時はMS  Pゴシックに。)  ここまではわかったのですが
>「フォントの CharSet / Name を動的に切り替える仕組みが必要になると思います。
というのは具体的にどのようにするのか教えてください。低レベルの質問で申し訳ありませんがよろしくお願いします。

文字列については元々全て英語に切り替えるようにしていますので


DEKO  2012-07-25 12:54:35  No: 42625

> 手元にあるWin7を調べたらHomePremiumでしたので
えっと、XP Mode が HomePremium で動かないという制限はもうありませんよ。

> 具体的にどのようにするのか
Font.Name を変更するのと同じように Font.Charset も変更するという事です。

最近の Delphi (2009 以降) だと、アプリケーションが標準で使うフォントを
Application.DefaultFont で設定できるのですが、D6 にはこれがありません。
(Kylix には Application.Font があるのですが...)

...よって、

1.環境設定ファイルを用意しておく。
2.デフォルトの Font.Name / Font.Charset を環境設定ファイルから読み出す。
3.すべての "フォームの Font プロパティ" をこのデフォルト値で書き換える
  (フォームの OnCreate 等で)
4.フォーム上に貼られたコントロールで ParentFont が false のものは個別にフォント設定を行う。

といった処理が必要になると思います。

余談ですが、RTL / VCL 内のメッセージは日本語なため、エラー処理等をキッチリやっておかないと
「エラーメッセージが何か出てるけど読めないよ」と言われてしまう事があります。

# ご丁寧にスクショを送ってもらってもこっちも読めないという... (^^;A

なお、Delphi 2010 以降ではライブラリの言語切り替えに対応しています


take  2012-07-25 18:06:13  No: 42626

>えっと、XP Mode が HomePremium で動かないという制限はもうありませんよ。

公式サイトからダウンロードしようとすると
「条件を満たしていません」って言われますけど・・・

「CPUによる仮想マシン支援機能」が必須ではなくなったことと
勘違いされているのでは?

HomePremiumでXPモードが動くのだったら
是非入れてみたいですね


Nov  2012-07-25 19:38:08  No: 42627

>公式サイトからダウンロードしようとすると

試してませんが、こういうことのようです。
http://freesoft.tvbok.com/tips/win7rc64/set_up_xp_mode.html


take  2012-07-25 20:56:21  No: 42628

そのサイトの人はオチを書いていないようですが
実際にはライセンスが無効の状態でXPをインストールした状態になるようです。
つまり30日間だけ動くようです。

HomePremiumでXPモードを動かすためには別途WindowsXP Professional以上のライセンスを所持していないと駄目なようです。

自分はHomePremiumが初期インストールされているPCでXPモードを使いたいので、
Anytime Upgradeパックの購入したのですが、
それがただで出来ちゃうと悲しいものがあります。


Nov  2012-07-25 21:30:21  No: 42629

>そのサイトの人はオチを書いていないようですが

説明が不足していましたので、念のため。
リンク先には、HomePremiumにはXPModeのライセンスが付属して無いけど、
もしXPのライセンスが余っていれば、使用できるということのようです。

--- 以下、引用 ---

XPモードの要求スペック
 
OS:
 Windows 7 Home Basic以上で作動。
 Professional以上には「仮想XP」一台分のライセンス有り。
 Home Premium以下では別途XPライセンスとインストールDVDが必要。


DEKO  2012-07-25 21:51:28  No: 42630

> Home Premium
継続的に使うなら Windows XP Professional のライセンスが余っていないとダメですが、
30日あれば大抵の事はできるかと思います。

・Windows 7 HomePremium しか持っていない。
・XP Pro のライセンスが余っていない。
・でも、継続的に英語版 Windows のテストをしたい。

という事であれば、Anytime Upgrade (1万円程度) で
Windows 7 Professional にするのが手っ取り早いでしょう。

Microsoft Technet サブスクリプションとかを持ってれば仮想化するなりして
OS 毎 / 言語毎の挙動の違いを簡単にテストできるのですけどね。

[Microsoft Technet サブスクリプション]
http://technet.microsoft.com/ja-jp/subscriptions/ms772428

# Windows 8 とかも入手できますし、
# 32bit / 64bit でのテストとかもできますから。


take  2012-07-25 22:17:28  No: 42631

スレ違いになってしまいますが

XPの余っているライセンスは、こちらにも確かにあるけど
結局Homeしか余ってないのですよね〜。

相手側の環境(OSなどの違い)を想定して組まないといけない場合は
やはりMicrosoft Technet サブスクリプションに入って
対応しておかないといけないということですかね。

Windows7対応ですらこの間始めたところで
もうWindows8の対応を考えないといけないとは


mizuki  2012-07-26 01:16:52  No: 42632

DEKO様、皆様、たくさんのアドバイスをありがとうございます。
1.CharSetとFontName
100近くあるオブジェクトを一つづつCharSetとFontNameを指定するProcedureを作りました。これでとりあえず実験したいと思います。
-----------------------------------------------------------
(追加質問1)
Unitの最初のところにあるTypeの項目からオブジェクトをコピーしてそれぞれのCharSet、FontNameを指定するようにしましたが、これをスマートに「For each・・・のように一挙に変更する方法などありますでしょうか?  よろしくお願いします。

(追加質問2)
今はロケールを調べて英語か日本語かを判別しようとしていますが原理的には使用するパソコンにMS  Pゴシックが入っているかを調べてみて、入っていなければ英語設定にする、というのが理にかなっているような気がします。指定するフォントがパソコンに入っているか判別する方法を教えてください。

2.XPモード
私が調べたところではProfessional以上でないとXPモードはだめと書かれて降りましたがNov様ご紹介のサイトでは確かにHomePremiumでもOKのようです。しかし読み進めてみるとHDDがすぐに10GBを超えるなどと書かれています。当方のWin7のPCは買った時からC:ドライブが50GBでD:ドライブが450GBとなっておりすぐにC:ドライブの容量不足となって止まってしまうのでXPモードは躊躇してしまいます。

以上、とりあえずCharSetとFontNameの設定をしてみましたのでこれからはテストにすすみたいと思います。  ありがとうございました。


DEKO  2012-07-26 03:03:02  No: 42633

> (追加質問1)
すべてのフォントを変更するのは面倒ですよね。
先にも書きましたが ParentFont を有効活用すれば、フォーム単位での修正で済みます。それが無理なのであれば...

for i:=0 to ComponentCount-1 do
  begin
    if (Components[i] is TButton) then
      begin
        Components[i].Font.Name := DEFFONT_NAME
        Continue;
      end;
    if (Components[i] is TCustomEdit) then
      begin
      ...
  end;

このような処理を Form の OnCreate に記述したものをベースフォームとし、
既存のフォームをこのベースフォームから派生させるようにすれば多少は楽になります。
(既存のフォームに OnCreate イベントハンドラがあるのなら inherited を追加して下さいね)

>(追加質問2)
HasJpFont := Screen.Fonts.IndexOf('MS Pゴシック');

でどうですか?応用として

HasMeiryo := Screen.Fonts.IndexOf('メイリオ');

このようにすれば、
"XP でもメイリオフォントがインストールされていれば、メイリオフォントを使う"
...なんて事ができます。


DEKO  2012-07-26 03:12:19  No: 42634

ちょっとコードが変でしたね。

  if (Components[i] is TCustomButton) then
    begin
      with (Components[i] as TCustomButton) do
        begin
          Font.Name    := DEFFONT_NAME;
          Font.CharSet := DEFFONT_CHARSET;
        end;
      Continue;
    end;
  if (Components[i] is TCustomEdit) then
    begin
      with (Components[i] as TCustomEdit) do
        begin
          Font.Name    := DEFFONT_NAME;
          Font.CharSet := DEFFONT_CHARSET;
        end;
      Continue;
    end;
  ...

こんな感じです。


DEKO  2012-07-26 03:15:39  No: 42635

フォント存在チェックの方も珍妙なコードを書いてました m(_ _)m

var
  HasJpFont: Boolean;
  HasMeiryo: Boolean;
begin
  HasJpFont := (Screen.Fonts.IndexOf('MS Pゴシック') >= 0);
  HasMeiryo := (Screen.Fonts.IndexOf('メイリオ') >= 0);
  ...


monaa  2012-07-26 03:21:28  No: 42636

D6Pにあるか知りませんが
procedure TForm1.FormCreate(Sender: TObject);
begin
  Font := Screen.MenuFont;
end;
でフォームのフォントをシステムフォントに割り振り
子コントロール.ParentFont:=True; //デフォルト
ならコントロールのデザイン的な問題は残りますが、
英数使ってる限りでは文字化けしないと思いますよ。


mizuki  2012-08-22 03:04:24  No: 42637

DEKO様  monna様  いろいろとアドバイスをありがとうございます。
各種のテストをしてきましたが、やはり英語OSのPCがないと文字化けが直っているのか確信がもてません。  そこで安価な英語OSのPCを見つけ、数日後には入手できる予定ですので試してみた結果をまたご報告させていただきます。ありがとうございました。


mizuki  2012-08-26 02:42:50  No: 42638

皆様  沢山のアドバイスをありがとうございました。
皆様のアドバイスを参考に英語PCでテストしながら進めた結果計画通りの結果を得ることができました。Parent Fontを全部Trueにすると特定の文字の色、サイズなども意図しないものになってしまうため面倒ですが全オブジェクトを一つづつ指定しました。ここにある英語PCでのテストでは文字に関しては正常に表示できるようになりましたので解決とさせていただきます。  (しかし日付時刻関数などで別の問題も湧き上がりました)
皆様ありがとうございました。

var
  HasJpFont: Boolean;
  CSet:TFontCharSet;
  FONTnam:TFontName;
begin

HasJpFont := (Screen.Fonts.IndexOf('MS Pゴシック') >= 0);

if HasJpFont=false then begin
     cset:=ANSI_CHARSET;
     fontnam:='MS Sans Serif';
end else begin
     cset:=SHIFTJIS_CHARSET;
     fontnam:='MS Pゴシック';
end;

form1.Label1.font.charset:=CSET;   
FORM1.Label1.font.name:=FONTNAM; 

form1.pnlSPLITE.font.charset:=CSET;
FORM1.pnlSPLITE.font.name:=FONTNAM;

form1.CheckBox1.font.charset:=CSET;
FORM1.CheckBox1.font.name:=FONTNAM;



end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加