LST ISO/IEC 8859-13
ウィンドウにコードページ文字を表示する必要があります。現在ShowMessage
、この目的のために関数を使用しています。Windows ロケールがこの地域の場合はすべて問題なく表示されますが、たとえばロケール English UK の場合はどうすればよいですか? この場合、「?」だけです。キャラクターの代わりに。MS Word は正しいロケールなしで地域の文字を表示するため、地域の文字を表示する可能性があるはずです。しかし、それを行う方法は?
3 に答える
実行可能で扱いやすいオプションが 2 つあります。
- 国際化テキストのサポートが組み込まれている Delphi の Unicode バージョンにアップグレードするか、または
WideString
Unicode を使用してエンコードされた COM タイプを使用して、そのサポートを Unicode 以前の Delphi に移植する TNT Unicode コントロールを使用します。
Word は、Windows のネイティブ Unicode API を使用するため、これを行うのに問題はありません。一方、Delphi 7 は、Windows 95/98/ME との互換性を提供するためだけに存在する ANSI API を使用します。
短縮版:
特定のコンポーネントが特定の文字セットで文字を表示することを (より) 確実にしたい場合は、Font.Charset プロパティも設定する必要があります。
長いバージョン(申し訳ありません:私は言葉が多い傾向があります)
Unicode を使用しても (まだ行っていない場合は、Unicode バージョンの Delphi に切り替える必要があります)、外国の PC にインストールされているフォントに、表示したいすべてのシンボルが含まれているとは限りません。さらに、Unicode を使用しても、必要な文字セットを実際にサポートするフォントをオペレーティング システムに強制的に選択させることはできません。キリル文字を表示できるフォントがインストールされていても、ウィンドウはそのフォントを選択しません。キリル文字の Unicode コード ポイントを含む文字列をレンダリングします。デフォルトのシステム フォントが引き続き使用されます。
したがって、アプリケーションが必要とする文字セットをサポートするフォントをインストールするよう顧客に依頼する必要がある可能性は常にあります。これが深刻な問題になる可能性がある場合は、必要なフォントをバイナリと共に配布することを検討する必要があります (フォントの著作権に注意してください)。第二に、アプリケーションにコンポーネントがある場合、それらが常にロシア語のテキストを表示することは確実です。そのようなコンポーネントでは、Font.Charset = RUSSIAN_CHARSET を割り当てる必要があります。これは、ウィンドウに「このコンポーネントにキリル文字を表示する必要があるため、地球のどちら側を実行しているかに関係なく、適切なフォントを選択してください」と伝える方法です。
Unicode プログラムでは charset プロパティが役に立たないというのはよくある誤解です。それはまったく逆です。
もう 1 つの一般的なエラーは、"XYZ" フォントが世界中のすべての Windows インストールで同一であると想定することです。そのため、私の PC で Thamoa を使用してキリル文字を表示できる場合は、Thamoa を使用して世界中のキリル文字を安全に表示できます。 . これはまったく逆です。コンピューターのロケールに応じて、異なる Unicode サブセットがインストールされます。
そして... AFAIK ShowMessage() はシステムのデフォルトフォントを使用するため、「奇妙な」文字を含むメッセージを表示するためにこの手順を使用することはできません。独自の ShowMessage ダイアログボックスを作成する必要があります。
編集:これは私が言っていることを示す例です
フォームに TPaintBox コンポーネントをドロップし、「pbox」という名前を付けて、この OnPaint イベント ハンドラを記述します (ソースを utf-8 形式で保存することを忘れないでください。そうしないと、ロシア語の記号が壊れてしまいます)。
procedure TForm1.pboxPaint(Sender: TObject);
begin
pbox.canvas.Font.Name := 'Fixedsys';
pbox.Canvas.TextOut(0,0,'Это русский');
pbox.canvas.Font.Name := 'Fixedsys';
pbox.canvas.Font.Charset := RUSSIAN_CHARSET;
pbox.Canvas.TextOut(0,20,'Это русский');
end;
イタリアの PC (そして西ヨーロッパやアメリカの PC だと思います) では、通常、fixedsys フォントにはロシア語の文字記号が含まれていません。最初の TextOut は FixedSys フォントの使用を主張し、ゴミを書き込みます。たとえば、私のPCでは、一連の黒い四角いボックスが表示されます。
2 番目のテキスト出力は、charset=RUSSIAN_CHARSET を設定した後に作成されるため、Windows はロシア語の記号が必要であることを認識し、別のフォントを選択します。2 番目の TextOut は、私が使用したかった FixedSys フォントを使用していませんが、少なくとも読み取り可能です!
Windows のロシア語のインストールでは、両方の TextOut 呼び出しが、FixedSys フォントを使用してロシア語のテキストを正しくレンダリングします。これは、Windows のロシア語のインストールには、fixedsys フォントのロシア語版があるためです。そしてWindowsはそれを知っています。
Windows システムに複数のロケールをインストールできます。一致するロケールを使用している場合、それがデフォルトのロケールであり、正しいロケール/文字セットを使用するテキスト フィールドを持つダイアログを使用できます。English UK がインストールされている開発システムで、不足している言語を追加します。
Unicode の方が優れていますが、デフォルト以外の文字セットの文字を表示する必要はありません (Uincode が発明される前は、コンピュータは多くの文字セットを処理できました)。MS ワードパッドでさえ、Unicode が存在するずっと前から、マルチバイト文字セット (韓国語、日本語、中国語) を含むさまざまなコードページの文字を表示できました。
デフォルトのロケールに固執するため、ShowMessage は使用できません。ただし、カスタム ダイアログ スタイルのフォームに簡単に置き換えることができます。