web-dev-qa-db-ja.com

拡張ASCIIをSystem.Stringに変換するにはどうすればよいですか?

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

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

UnicodeEncoding.Unicode.GetString(b);

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

ASCIIEncoding.ASCII.GetString(b);

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

22
rtremaine

バイト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など)が、常に指定することをお勧めします。

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

27
Richard

古いPC-8または拡張ASCII文字セットは、IBMとMicrosoftがコードページのアイデアをPCの世界に導入する前から存在していました。これは、拡張ASCII-実際、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);
    }
14
Tom Wilson

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

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

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

13
Jon Skeet

System.String[]は、拡張されたASCII ASCII > 127here などの文字を処理しようとしている場合、œ ¢ ½ ¾で文字を格納できません。それを2進数と10進数に相当するものに変換する方法です

1
Ritwik