4

コード ページ 437 でエンコードされた ASCII 文字列を別のシステムから取得しています。これを Unicode に変換する必要があるため、他の Unicode 文字列と混在させることができます。

これは私が取り組んでいるものです:

var asciiString = "\u0094"; // 94 corresponds represents 'ö' in code page 437.

var asciiEncoding = Encoding.GetEncoding(437);
var unicodeEncoding = Encoding.Unicode;

// This is what I attempted to do but it seems not to be able to support the eight bit. Characters using the eight bit are replaced with '?' (0x3F)
var asciiBytes = asciiEncoding.GetBytes(asciiString);

// This work-around does the job, but there must be built in functionality to do this?
//var asciiBytes = asciiString.Select(c => (byte)c).ToArray();

// This piece of code happliy converts the character correctly to unicode { 0x94 } => { 0xF6, 0x0 } .
var unicodeBytes = Encoding.Convert(asciiEncoding, unicodeEncoding, asciiBytes);
var unicodeString = unicodeEncoding.GetString(unicodeBytes); // I want this to be 'ö'.

私が苦労しているのは、127 を超える文字コードの文字列をバイト配列に変換するための適切なメソッドが .NET フレームワークで見つからないことです。127 を超える文字を含むバイト配列を Unicode 文字列に変換するサポートがあるため、これは奇妙に思えます。

だから私の質問は、この変換を適切に行うための組み込みの方法はありますか、それとも私の回避策はそれを行う適切な方法ですか?

4

3 に答える 3

4
var asciiString = "\u0094";

名前が何であれ、これは常にUnicode文字列になります。.NET には Unicode 文字列しかありません。

別のシステムからコード ページ 437 でエンコードされた ASCII 文字列を取得しています

受信データをbyte[]ではなく として扱いstringます。

var asciiBytes = new byte[] { 0x94 }; // 94 corresponds represents 'ö' in code page 437.

var asciiEncoding = Encoding.GetEncoding(437);    

var unicodeString = asciiEncoding.GetString(asciiBytes);
于 2012-08-14T12:44:56.417 に答える
4

\u0094制御文字であるUnicode コードポイント0094です。ありません。あなたが望むなら、正しい文字列は öö

string s = "ö";

これは、コードポイント 00F6 とも呼ばれる LATIN SMALL LETTER O WITH DIAERESIS です。

そう:

var s = "\u00F6"; // Identical to "ö"

エンコーディングを取得します。

var enc = Encoding.GetEncoding(437);
var bytes = enc.GetBytes(s);

そして、それはシングルバイトの 10 進数の 148、つまり 16 進数の 94 であることがわかりました。つまり、あなたが求めていたものです。

ここで重要なのは、C# でこの"\uXXXX"構文を使用する場合、XXXX は特定のエンコーディングでエンコードされた値ではなく、常にUnicode コードポイントを参照していることです。

于 2012-08-14T12:52:13.750 に答える
2

コードの前の方を見る必要があります。データを文字列として取得したら、それは既にデコードされています。そのデコードで失われた文字は、元に戻すことができません。

コード ページ 437 のエンコーディング オブジェクトを使用して文字列にデコードできるように、入力はバイトとして必要です。

byte[] asciiData = new byte[] { 0x94 }; // character ö in codepage 437

Encoding asciiEncoding = Encoding.GetEncoding(437);

string unicodeString = asciiEncoding.GetString(asciiData);

Console.WriteLine(unicodeString);

出力:

ö
于 2012-08-14T12:48:59.530 に答える