1) 拡張 ASCII、2) UTF-8、または 3) UTF-16 としてエンコードされているかどうかに関係なく、いくつかのバイト ストリームがあります。また、英語、フランス語、または中国語の場合もあります。ユーザーがバイト ストリームを入力し、エンコーディングの 1 つと言語の 1 つを選択して、その方法で解釈されたときに文字列がどのように見えるかを確認できる簡単なプログラムを作成したいと思います。または、9 つの可能な方法のそれぞれで各文字列を単純に解釈し、それらすべてを表示します。地域化を繰り返し切り替える必要は避けたいと思います。私は Delphi 2007 を使用しています。私がやろうとしていることは可能ですか?
1 に答える
Delphi 2009 以降では、Unicode がサポートされ、このほとんどを透過的に実行できるため、これはより簡単になります。古いバージョンの場合、もう少し手作業が必要です。
最初に、テキストを共通のコードページに変換します。これは Windows のネイティブ コードページであるため、できれば UTF-16 を使用してください。そのためには、MultiByteToWideChar関数を使用します。UTF-8 から UTF-16 の場合、言語は関係ありません。「拡張 ASCII」の場合、適切なソース コード ページを選択する必要があります (たとえば、英語とフランス語の場合は Windows-1252、GB2312 または Big5 またはその他の中国語のコード ページ - 受け取るものによって異なります)。これらを格納するには、UTF-16 を直接格納する WideString を使用できます。
それができたら、何らかの形でテキストを描画する必要があります。そのためには、Unicode 対応のコントロールを取得するか (おそらくラベルで十分です)、記述するか、適切な Windows API 関数を直接呼び出して描画する必要があります。それを行うための関数がいくつかあるため、それは少し面倒になる可能性があります。ここではおそらくTextOutWが最も簡単な選択ですが、別のオプションとしてDrawTextがあります。Unicode を使用するには、これらの関数の W バージョンを明示的に呼び出すようにしてください。(関連する質問「Unicode テキストを描画するにはどうすればよいですか? 」も参照してください)。
注意: CJK の統一 - 同等の中国語の漢字、日本語の漢字、韓国語の漢字を Unicode の同じコード ポイントでエンコードするため - 予想される種類の中国語 (繁体字または簡体字) に一致するフォントを選択する必要があります。期待されるレンダリングを取得します。マイケル・カプランによるやや関連する投稿を引用するには:
つまり、4 つの異なる外見を持つことができる多くのキャラクターが存在するということです。
- 日本語はデフォルトで MS UI Gothic を使用します (PMingLIU、SimSun、Gulim にフォールバック)
- 韓国語はデフォルトで Gulim を使用します (PMingLiu、MS UI Gothic、SimSun にフォールバック)
- 簡体字中国語はデフォルトで SimSun を使用します (PMingLiu、MS UI Gothic、Batang にフォールバック)
- 繁体字中国語はデフォルトで PMingLiu を使用します (SimSun、次に MS Mincho、次に Batang にフォールバック)
使用したい/必要な特定のフォントがない限り、使用したい言語バリアントのリストの最初のフォントを選択してください。これらは標準フォントです (XP では、東アジア言語のサポートを有効にする前に有効にする必要があります)。利用可能で、Vista 以降では常に含まれています)。これを行わないと、Windows は文字をまったくレンダリングしない (代わりに不足している文字のグリフを表示する) か、不適切なフォールバック (簡体字中国語の PMingLiu など) を使用する可能性があります。正確な動作は、使用する API 関数によって異なります。テキストをレンダリングするために使用します。