デルファイ7でUnicode文字をASCIIコードに変換するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/305162

  •  08-07-2019
  •  | 
  •  

質問

はい、ASCIIコードについて話しています。私はここでDelphi開発者ではありません。

役に立ちましたか?

解決

Delphi 7の場合、無料のUnicodeライブラリVirtual Treeviewの作成者であるMike Lischke

ライブラリには、ユニコードとの間でやり取りする多くの変換関数が含まれているため、アプリケーションで最も意味のあるものを使用できます。

またはDelphi 2009にアップグレードできますにはエンコードルーチンが組み込まれており、変換関数の独自のライブラリがあります。

他のヒント

いくつかのことをまっすぐにしましょう。文字セット(文字セット)と文字エンコードは、2つの関連する概念ですが、異なる概念です。文字セットは、ある種の整数文字コードが関連付けられた文字の抽象的なリストです。次に、文字エンコードがあります。これは基本的に、文字がバイト単位で表現される方法を説明するアルゴリズムです。

ASCII は、文字セットとエンコードの両方として機能します。 7ビットを使用して128文字を表現します(94印刷可能)。一方、 Unicode は、1,114,112個のコードポイントを表す文字セットです。 Unicode文字列を表すいくつかのエンコーディングがありますが、最も注目すべきエンコーディングはUTF-8、UTF-16、UTF-16LE、およびUTF-32です。つまり、単一のUnicode文字は、エンコーディングに応じてさまざまな方法で表すことができます。

  

デルファイ7でUnicode文字をASCIIコードに変換するにはどうすればよいですか?

質問は2つの方法で解釈できると思います。

  1. ASCII印刷可能文字のみを含むエンコードのUnicode文字列があります。文字列をASCIIエンコーディングのバイト配列に変換するにはどうすればよいですか?

  2. 一部のエンコーディングにはUnicode文字列があり、中国語文字などの非ASCII印刷可能文字も含まれています。情報を失わずに文字列をASCIIエンコードにエンコードし、後で元のUnicode文字列にデコードするにはどうすればよいですか?

最初の場合は、Osmanが言っているようにUnicode文字列をWideStringに読み込むことができます

var
  original: WideString;
  s: AnsiString;
begin
  s := AnsiString(original);

2番目の場合、 Base64 エンコードのような汎用エンコードアルゴリズムが必要になります。デビッド・バートンの DCPcrypt v2 Beta 3

変換の定義が何であるかによります。最下位の127文字をUnicodeに対応させたい場合は、明示的なキャストを使用できます。ただし、文字列に上位の文字が含まれていると、ガベージが作成されます。

ëのようなマッピングが必要な場合-> eおよびû -> u、あなたはあなた自身のコードを書くことができます。ただし、変換できない文字は常に存在することに注意してください。

" ASCII"文字と数字の特定のマッピングの名前ですが、「ASCIIコード」と言う人もいます。本当にASCIIを意味しない場合。その時点で有効なマッピングが何であれ、文字の数値が必要なだけです。その説明はあなたに当てはまりますか?

その場合、 Ord 標準関数を使用して、Unicode文字のUnicodeコードポイント値を取得できます。

var
  wc: WideChar;
  ws: WideString;
  x: Word;

x := Ord(wc);
x := Ord(ws[1]);

ただし、本当にASCIIを意味する場合は、どのような変換を念頭に置いているかについて、より具体的にする必要があります。

例として、文字AはUnicodeでU + 0041として、ANSIで41として表されます。したがって、変換は非常に簡単ですが、Unicode文字がどのようにエンコードされるかを調べる必要があります。最も一般的なのはUTF-16およびUTF-8です。 UTF 16は基本的に文字ごとに2バイトですが、文字がより多くのバイトを持っている可能性があるため、それでも簡単すぎます。 UTF-8は、文字ごとに1バイトを意味するように聞こえますが、2または3でもかまいません。問題をさらに複雑にするために、UTF-16はリトルエンディアンまたはビッグエンディアンにすることができます。 (U + 0041またはU + 4100)。

たとえば、英語ロケールでアラビア語の文字U + 0639をANSIに変換したい場合は、質問に意味がありません。できません。

UnicodeからASCIIへの変換に関する関連質問を参照してください:

一般に、数十万のエントリの文字セットは、情報またはエンコードスキームの損失なしに127のエントリの文字セットに変換できません。

http://swissdelphicenter.ch/en/showcodeの関数を使用できます。 .php?id = 1692
指定されたコードページを使用してUnicode文字列をAnsi文字列に変換します。
デフォルトのシステムコードページ(地域オプションで非Unicodeコードページとして定義されている)を使用して変換する場合は、次のように簡単に実行できます。

var
  ws: widestring;
  s: string;
begin
  s:=string(ws)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top