3

このC#コード...

string s = "\u00C0";
byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s);
Trace.WriteLine(BitConverter.ToString(bytes));

次の出力が生成されます。

3F

出力が C0 でないのはなぜですか?

4

3 に答える 3

4

\u00c0ASCII ではないため(0 ~ 127 の範囲)。その結果、疑問符?(0x3F) であるかのようにエンコードされます。

ASCIIEncodingに関する MSDN の記事を参照してください。

ASCIIEncoding は、Windows コード ページ 20127 に対応します。ASCII は 7 ビット エンコーディングであるため、ASCII 文字はU+0000 から U+007Fまでの Unicode 文字の下位 128 文字に制限されます。Encoding.ASCII プロパティまたは ASCIIEncoding コンストラクターによって返される既定のエンコーダーを使用する場合、その範囲外の文字は、エンコード操作が実行される前に疑問符 (?) に置き換えられます。

于 2013-04-12T05:04:08.237 に答える
4

Unicode 文字列を表すバイト シーケンスが必要なようです。明らかに、バイトはエンコーディングに依存します。C0 がバイトの 1 つであると予想されるため、オプションが少し絞り込まれます。これは UTF16LE です。これは、 BMP文字\u00c0を完全に表すため、もちろん 2 バイトです。

string s = "\u00C0";
byte[] bytes = Encoding.Unicode.GetBytes(s);
Trace.WriteLine(BitConverter.ToString(bytes));

Joel Spolsky 著 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) をお読みください。

于 2013-04-12T05:25:59.363 に答える
1

最初のステップ: Unicode char を文字列に割り当ててから、それを ASCII に変換します (ただし、Unicode です)。次に、ユニコードコンバーターを使用して元に変換しようとしています。

次の例では、私の応答をより明確にするためにすべての可能性を実行します。

    static void Main(string[] args)
    {
        string s = "\u00C0";
        Console.WriteLine(s);
        byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s);
        Console.WriteLine(BitConverter.ToString(bytes));
        Console.WriteLine(ASCIIEncoding.ASCII.GetString(bytes));

        Console.WriteLine("Again");
        bytes = Encoding.UTF8.GetBytes(s);
        Console.WriteLine(BitConverter.ToString(bytes));
        Console.WriteLine(Encoding.UTF8.GetString(bytes));

        Console.ReadLine();
    }

出力は次のとおりです。

A
3F
?
Again
C3-80
A

ところで BitConverter.GetBytes の定義は次のとおりです。

指定したバイト配列の各要素の数値を、等価の 16 進数文字列表現に変換します。

于 2013-04-12T05:09:07.687 に答える