23

例: "½" または ASCII DEC 189。テキスト ファイルからバイトを読み取ると、byte[] に有効な値 (この場合は 189) が含まれます。

Unicode に変換すると、Unicode 置換文字 65533 になります。

UnicodeEncoding.Unicode.GetString(b);

ASCII に変換すると、63 または "?" になります。

ASCIIEncoding.ASCII.GetString(b);

これが不可能な場合、このデータを処理する最善の方法は何ですか? Replace() のような文字列関数を実行できるようにしたいと思います。

4

4 に答える 4

29

バイト 189 は iso-8859-1 (別名 "Latin-1") の "½" を表すため、次のようにする必要があります。

var e = Encoding.GetEncoding("iso-8859-1");
var s = e.GetString(new byte[] { 189 });

.NET のすべての文字列と文字は UTF-16 でエンコードされているため、エンコーダー/デコーダーを使用して他のものを変換する必要があります。これはデフォルト (FileStream インスタンスの場合は UTF-8 など) になっている場合がありますが、常に指定することをお勧めします。

エンコーディングに関する情報を提供するには、なんらかの形式の暗黙的または (より良い) 明示的なメタデータが必要になります。

于 2009-03-20T14:50:07.250 に答える
14

古いPC-8または拡張ASCII文字セットは、IBMとMicrosoftがコードページのアイデアをPCの世界に導入する前から存在していました。これは拡張ASCIIでした-1982年。実際、EGAカードで他のフォントをVRAMにロードできるようになるまで、PCで使用できる文字セットはこれだけでした。

これはANSI端末のデフォルトの標準でもあり、80年代から90年代初頭にダイヤルアップしたほぼすべてのBBSは、メニューとボックスの表示にこの文字セットを使用していました。

8ビット拡張ASCIIをUnicodeテキストに変換するコードは次のとおりです。コードの重要な部分であるGetEncoding( "437")に注意してください。コードページ437を使用して、8ビットASCIIテキストを同等のUnicodeに変換しました。

    string ASCII8ToString(byte[] ASCIIData)
    {
        var e = Encoding.GetEncoding("437");
        return e.GetString(ASCIIData);
    }
于 2012-02-28T22:59:39.687 に答える
13

それは、エンコーディングが何であるかに正確に依存します。

「ASCII 189」というものはありません。ASCII は 127 までしかありません。最初の 128 の値に ASCII を使用する 8 ビット エンコーディングの多くのエンコーディングがあります。

必要かもしれませんがEncoding.Default(特定のシステムのデフォルトのエンコーディングです)、確実に知ることは困難です。あなたのデータはどこから来たのですか?

于 2009-03-20T14:32:19.617 に答える