英文フォントでギリシャ文字

解決


garakuta  2007-04-11 15:08:51  No: 136025

Century,TimesNewRomanなどのフォントで、α、μなどのギリシャ文字を
表示する方法は、ありますでしょうか?
  上記以外の英文フォントでも良いのですが、英文フォントで、ギリシャ
文字を表示できるものがあればご教示いただきますようお願いします。
  海外でも使う、VBアプリのラベルの表示に使いたい。
  VB6,NETで条件が違うのかも、ご存知でしたら、お教えいただきますよう
お願いいたします。


魔界の仮面弁士  2007-04-11 16:41:56  No: 136026

海外でも使いたいなら、VB.NET の方が扱いは楽かと。

で、海外での利用を考えるのであれば、
  案1) 各国で、それぞれ異なるフォントと文字セットを用いる。
  案2) Unicode 対応フォントを用いる。
のいずれかを採用するとか。

> Century,TimesNewRomanなどのフォントで、
うむむ…「など」という部分の定義が引っかかりますが、
Symbol フォント等では駄目、ということでしょうか。


garakuta  2007-04-11 17:53:00  No: 136027

魔界の仮面弁士様、ご回答、大変ありがとうございました。

>> Century,TimesNewRomanなどのフォントで、
>うむむ…「など」という部分の定義が引っかかりますが、
>Symbol フォント等では駄目、ということでしょうか。

  長さの単位を”μm”などと表したいので、1つのフォントで
アルファベットと、ギリシャ文字両方扱えるものがほしいのです。

  ラベルなどのコントロールのフォントは1つしか指定できないので
ある文字だけに記号フォントを使えないと思うのですが、いかがで
しょうか?

  Unicode対応フォントというものを使ったことがないのですが、
アルファベット、数字、ギリシャ文字程度が扱え、欧米圏の
パソコンに標準で入っているものには、どんなものがありますで
しょうか?


魔界の仮面弁士  2007-04-11 18:31:57  No: 136028

>  長さの単位を”μm”などと表したいので、1つのフォントで
> アルファベットと、ギリシャ文字両方扱えるものがほしいのです。
"α" (03B1)や "μ" (03BC) を表すというのが目的であれば、
少なくとも「MS Pゴシック」などは、その条件を満たしていますよね。

ちなみに、Unicode のギリシア文字ブロック(Greek: 現代ギリシア語、
古代ギリシア語、コプト語)は、0370〜03FF の範囲にあります。
また、1F00〜1FFF には、ギリシア文字拡張ブロック(Greek Extended:
ISO 10646の初期の原案から取り入れた合成済みギリシア文字)があります。

> ラベルなどのコントロールのフォントは1つしか指定できないので
複数指定可能なコントロールを使うか、自前で描画して対応するか、
多言語対応フォントを用いるか、の 3 択となるでしょう。

> Unicode対応フォントというものを使ったことがないのですが、
有名どころでは、Office 等に付属の "Arial Unicode MS" フォント。
その他、下記などを参考にしてみてください。
http://www.kmatsum.info/lec/hongo/corpusI/html/fonts.html


garakuta  2007-04-11 22:15:10  No: 136029

魔界の仮面弁士様、ご回答、大変ありがとうございました。

>"α" (03B1)や "μ" (03BC) を表すというのが目的であれば、
>少なくとも「MS Pゴシック」などは、その条件を満たしていますよね。

  実はラベルのフォントをMSゴシックにして、アルファベット、ギリシャ
文字両方を表現していました。
 
  ところが、英語OSのパソコンで実行すると、μは文字化けしました。
(カタカナのオになりました。)

  英語OSのパソコンは、当然日本語のフォントが入っていなくて、
MS Gothic ?というものが入っていました。

  MSゴシックと英語のMS Gothicのμの文字コードが同じなら、同じに
表現されるのでしょうが、違っているので、文字化けするのかと
思いました。

  それなら、日本語、英語両方あるフォントでなく、英語だけの
フォントでギリシャ文字も表現できれば問題ないのかと思い
ました。


魔界の仮面弁士  2007-04-12 01:16:48  No: 136030

> 実はラベルのフォントをMSゴシックにして
「MSゴシック」ではなく、
「MS ゴシック」ですよね。

> 当然日本語のフォントが入っていなくて、
環境が異なれば、使用可能なフォントも異なりますから、
どのフォントで表示するかを、適宜切り替えないといけないでしょう。

> μの文字コードが同じなら
ChrW(&H3BC) ですよね。同じですよ。
どちらの環境でも、Unicodeベースで処理されますから。


garakuta  2007-04-12 04:36:34  No: 136031

魔界の仮面弁士様、何度も懇切丁寧なご回答を
いただきまして、大変ありがとうございます。

>> μの文字コードが同じなら
>ChrW(&H3BC) ですよね。同じですよ。
>どちらの環境でも、Unicodeベースで処理されますから。

  そうなのですか?

  すると、私がMSゴシックと指定したのが、英語OSでは
認識できず、別のフォントで表現された可能性が高い
ということですか?

  そういえば、同じソフトを走らせているのに画面を
見比べると日本語OSと英語OSで、明らかに字体が違うと
見える箇所が多数ありました。

  英語OSでも、日本語OSでも共通に使われて、誤認され
にくい(しかもギリシャ文字も扱える)フォントという
ものは、あるものでしょうか?

  それとも、英語OSに対しては、英語版のVBを持ってきて
開発しないとだめなのでしょうか?


魔界の仮面弁士  2007-04-12 21:30:59  No: 136032

> 海外でも使う、VBアプリのラベルの表示に使いたい。
異なる地域で動作させる場合、フォント表示以外にも、幾つか考慮せねば
ならない点があります。時間のある時にでも、下記を眺めておいてください。
http://www.microsoft.com/globaldev/

また、VB のバージョンや OS によっても影響を受けるところですから、
質問時には、環境をきちんと明記するようにしておいてください。

たとえば、単位記号の「マイクロ」とギリシア文字「ミュー」を表示する
  Call MsgBox( _
    ChrW(&H00B5) & "=>U+00B5: Micro Sign" & vbCrLf & _
    ChrW(&H03BC) & "=>U+03BC: Greek Small Letter Mu" _
  )
というコードは、VBScript や VB.NET であれば、正しく表示されますが、
VB6 では Unicode 対応が不完全なため、どちらも『μ』になってしまいます。
# Win9x 環境の VBScript も駄目かも(未確認)。

>>どちらの環境でも、Unicodeベースで処理されますから。
>  そうなのですか?
はい。VBの文字列は、VB4 以降(.NET も含む)ではすべて、内部的には
UCS-2 の文字コードセットで処理される仕様になっています。

ただし、VB や OS 等の制限により、入出力時には、システム既定の
文字コードに変換される場合があり、この時点で問題が起こる可能性があります。

0x00〜0x7F の範囲については、各国の差はあまり無いのですが(完全一致では無い)、
0x80 を超える範囲の文字(Shift_JIS なら、半角カナなどがある領域)については、
文字のマッピングに違いがありますので、Unicode 非対応の環境だと、
テキストが化けてしまう可能性があるわけです。

そして、過去ログを見ていただくと幾つか事例があるのですが、標準で使える
コントロールの中には、Unicode文字列をそのまま扱える物もあれば、
システム既定の文字コードに変換されてから出力されるものもありますので、
使用するコントロールやメソッド等も吟味しなければなりません。

たとえば、VB.NET のコントロールの場合は、すべて Unicode のまま扱えますが、
VB6 の Label では、文字コード変換(日本語版では Shift_JIS への変換)が
暗黙的に発生するため、一部の文字が化けてしまうという現象が起こりえます。

ゆえに(大雑把に言えば)、以下のように対応することになるでしょう。

1) Unicode 対応コントロール + Unicode 対応フォントの組み合わせであれば、
  ほとんどの場合、問題は無いと思います。ただし、そのフォントにて、目的の
  文字がサポートされているかどうかは、事前チェックが必要でしょう。

2) Unicode 非対応コントロールの場合は、フォント等の動的切り替えが必要です。
  この場合、表示する文字も、その文字セットとフォントの両方が対応している範囲に
  限られます。(9x 系の OS を使う可能性があるなら、この対応が必要です)

3) 使用する文字が限定されている場合は、フリー/自作フォントを一緒に配布するのも手です。
  内容が固定的なら、文字ではなく、文字を描画した画像を使う手法もあります。

>  すると、私がMSゴシックと指定したのが、英語OSでは
> 認識できず、別のフォントで表現された可能性が高い
> ということですか?
それは、調べてみないとわかりません。フォントだけの問題とは限らないからです。

確かに、システムに無いフォントが指定されていた場合、代替フォントでの表示が
行われる結果となるため、そこで表示上の問題が発生することがあります。

しかし先に書いたように、暗黙の文字コード変換による問題もありえるわけです。
また、テキストそのものに問題は無く、かつ、.Font.Name も正しくセットされて
いたとしても、他にも化ける要因は幾つもあります。

たとえば、ランタイムの不足によって、リソースが化ける場合もあるでしょう。

あるいは、フォントスクリプト(書体の種類)の指定、すなわち、VB.NET の
「Font.GdiCharSet」とか、VB6 の「Font.Charset」などの設定次第でも、
文字表示が崩れる要因となる可能性があります。
ちなみに、この値は以下の 0〜255 の値をとります。

000 = 欧文(ANSI)
001 = 既定の文字セット
002 = シンボル(記号文字)
077 = MAC
128 = 日本語(Shift_JIS)
129 = ハングル(Hangeul)
130 = ハングル音節(Johab)
134 = 簡体字中国語(GB2312)
136 = 繁体字中国語(BIG5)
161 = ギリシア語(Greek)
162 = トルコ語(Turkish)
163 = ベトナム語(Vietnamese)
177 = ヘブライ語(Hebrew)
178 = アラビア語(Arabic)
186 = バルト言語(Baltic)
204 = キリル言語(Russian)
222 = タイ語(Thai)
238 = 中央ヨーロッパ言語(East-Europe)
255 = OEM/DOS

>  英語OSでも、日本語OSでも共通に使われて、
同じフォントを使うという選択肢もありますが、可能であれば、各環境ごとに
適切なフォントを切り替えて使うことも検討してみてください。

たとえば VB.NET の場合、『Language プロパティ』という物があります。
http://www.atmarkit.co.jp/fdotnet/dotnettips/314winmultilang/winmultilang.html

これにより、「英語」「ドイツ語」「日本語」等々のそれぞれの言語環境において、
Label1.Font や Label1.Text などのプロパティを、自動的に/明示的に切り替える
機能があり、これにより、常に適切な表示を行えるようになっています。
# ちなみに、英語環境で動作させたときに、「英語」設定がアプリ内に存在しなかった
# 場合には、ここで始めて既定のニュートラル言語設定が使われることになります。

>   英語OSでも、日本語OSでも共通に使われて、誤認され
> にくい(しかもギリシャ文字も扱える)フォントという
> ものは、あるものでしょうか?
『ギリシャ文字も扱える』の「も」が、何に掛っているのかが曖昧ですが、
『日本語も』という意味であれば、共通で使えるフォントは基本的に存在しないかと。
(もちろん、言語パック等をインストールしてやれば扱えるとは思いますが)

『「マイクロ メートル」という単位表示が必要』という意味であれば、本来は、
「μ」すなわち ChrW(&H3BC)の「小文字のギリシア文字ミュー」ではなく、
ChrW(&HB5) の「単位記号マイクロ」を用いるべきです。
ただし、日本語版 VB6 を使っている場合、ChrW(&HB5) は Label 等には表示できないので、
VB6 向けの Unicode 対応コントロール等を使うか、VB.NET で開発するようにするなどの
判断が必要でしょう。あるいは、「um」「micron」「micrometer」などで代用するとか。

『日本語不要、アルファベットとギリシア文字が表示できれば十分』という意味であれば、
Arial 系フォントが使えるでしょう(Win2000 や WinXP ならば)。ただしそれは、
Unicode 対応コントロールを使える場合の話であり、Unicode 非対応コントロールを
使う場合には、そこに渡せる文字データは、既定のコードページに引きずられますので、
実質上、VB6 では OS の違いを吸収しきれない結果になってしまう可能性があります。

>   それとも、英語OSに対しては、英語版のVBを持ってきて
> 開発しないとだめなのでしょうか?
VB6 の場合は、日本語版 VB しか持っていなくとも、『IPDK』
(Microsoft Visual Basic 6.0 International Package and Deployment Kit)
を利用することで、英語版のアプリケーションを作成および配布することが
可能になります。ただし、IPDK は、Service Pack 3〜5 のみしか対応されておらず、
SP6 対応版はリリースされていません。(ということで、あまりお奨めできません)
http://support.microsoft.com/kb/236404/en-us
http://www.microsoft.com/japan/msdn/vbasic/downloads/ipdk5down.aspx

一方、.NET の場合は、多言語対応が最初から実装されているため、そうした
パッケージを使わずとも、標準で多言語対応が可能となっています。
一応、リソース(エラーメッセージ等)の多言語対応のために、実行環境に
各言語版の Language Pack をインストールしておいた方が良いでしょうけれども。


garakuta  2007-04-18 15:05:58  No: 136033

魔界の仮面弁士様、何度も懇切丁寧、ご親切きわまるご回答をいただき、
大変ありがとうございました。

  それなのに、長い間お礼の連絡もいたさず、大変失礼をいたしました。

  最初VB.Netが有利だとおっしゃっていた理由もわかりました。
(私のレベルでは、すぐには細かいところまではわかりませんが、
解説いただいたことを読み返して、咀嚼したいと思います。)

  昨日、偶然解決に至りました。
  最初、チェック用に小さなプログラムを作ってみました。
  同じ環境でラベルに、α、μのギリシャ文字、△、○の記号文字を
様々なフォントでかいて表示させました。
  そしたら、この環境でMSゴシックでもArial Unicodeでも  
MS UI Gothicでも正常に表示されることがわかりました。
  どうも、プロパティボックスで表示内容を指定しただけなら
ギリシャ文字でも、記号でも問題なく表示できるのですが、XXを
変数として
        Label1.caption=Format(XX,"0.0###") & "μm"
のようなことをすると、文字化けを起こすようです。
  こうすると、システムでフォントがわからなくなるのかと思い
上記を行った後
        Label1.FontName="MS Gothic"
のようにすれば、ギリシャ文字までは表示されるようになりました。
これだけでは、△や○などの記号は救済できませんでした。
  希望としては、ギリシャ文字が表せればとのことだったので
その目的はかないました。

  どこからどう手をつけて良いか、途方に暮れていた私に救いの手を
差し伸べて下さいました、魔界の仮面弁士様に心より感謝いたします。

  これからも、どうぞよろしくお願いいたします。


garakuta  2007-04-18 15:38:25  No: 136034

私の環境についてのご報告が漏れておりました。

  開発はWinXP、VB6で行っております。

  試した英語OSの環境は、WinXPでした。  これにVB6のランタイムを
インストールしました。(これも、最初Vectorから持ってきたものを
インストールしようとしてうまくいかず、戸惑いました。)

  こういう問題の発生も考えると、VB6→VB.Netの移行も考える
必要があるのかと思えてきました。


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




  


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