2011-01-03 16 views
2

byte bがISO Latin 1(ISO 8859-1)としてエンコードされている場合はこれで十分です char output = (char)b;これは動作するようですが、別の方法があるかどうかわかりません。ISO latin 1バイトからchar

+0

私はcharがUTF-8であることを知っているので、キャスティングすればうまくいきます。 – maxfridbe

答えて

3

ダイレクトキャストは、この特定のエンコードでは機能しているようです。ただし、適切な変換にはEncoding.GetCharsメソッドを使用することをお勧めします。

private static readonly Encoding Iso88591 = Encoding.GetEncoding("ISO8859-1"); 

public static void Main() { 
    var bytes = new Byte[] { 65 }; 
    var chars = Iso88591.GetChars(bytes); 
} 
1

Encodingクラス(特にEncoding.ASCIIに組み込まれています)を使用すると、バイト配列から文字を取得できます。

特に、オーバーロードの1つ。

0

私はBitConverter's ToCharを使用します。 1つは、.NETのcharはデフォルトで2バイトの値であることを覚えておいてください。そのような単純なキャストは実際には最良のアイデアではありません。

+0

ISO-Latin-1は1バイトですが、0で埋めますか? – maxfridbe

0

バイトの値が< 128の場合は問題ありません。 128より大きい場合は、キャストしても正しい文字が得られない可能性があります。

ISOコードページは基本的にすべてASCIIで、コードページの値の上半分(ASCIIページの基本IIRCはコンソールアプリケーションで便利なラインアート文字です)と、言語に役立つ文字コードページの

ただし、Unicodeコードページを簡単に見てみると、Latin-1補足は80-FF値(128-255)を占めています。したがって、この特定のインスタンスでは、おそらく問題ありませんが、たとえばキリル文字のISOコードページなどで何かが入力された場合、明示的にUnicode文字に変換する必要があります。

2

はい、これは正常に動作するはずです。 unicode chart for 8859-1を見ると、8859-1とユニコードの間に1対1のマッピングがあります。つまり、それをcharにキャストできます。

しかし、これはすべてのコードページでは当てはまりませんので、より堅牢なソリューションが良いアイデアかもしれません。

+1

が正しくありません。 ASCIIとUTF-8の間には1対1のマッピングがあります。他のUnicode形式(UTF-16など)では、このようにマップされません。 – Oded

+0

これは正確に近いです。 1つ以上の8859-1標準があります。典型的なISO損失。 –

0

Encoding.Convertを使用できます。

 byte[] latin1 = new byte[]{}; // Your data goes here, obviously 
     byte[] converted = Encoding.Convert(Encoding.GetEncoding("latin1"), Encoding.ASCII, latin1); 

ラテン1が問題を引き起こすかどうかを心配することなく、新しいバイト配列で作業できます。

関連する問題