このC#コード...
string s = "\u00C0";
byte[] bytes = ASCIIEncoding.ASCII.GetBytes(s);
Trace.WriteLine(BitConverter.ToString(bytes));
次の出力が生成されます。
3F
出力が C0 でないのはなぜですか?
\u00c0
ASCII ではないため(0 ~ 127 の範囲)。その結果、疑問符?
(0x3F) であるかのようにエンコードされます。
ASCIIEncodingに関する MSDN の記事を参照してください。
ASCIIEncoding は、Windows コード ページ 20127 に対応します。ASCII は 7 ビット エンコーディングであるため、ASCII 文字はU+0000 から U+007Fまでの Unicode 文字の下位 128 文字に制限されます。Encoding.ASCII プロパティまたは ASCIIEncoding コンストラクターによって返される既定のエンコーダーを使用する場合、その範囲外の文字は、エンコード操作が実行される前に疑問符 (?) に置き換えられます。
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!) をお読みください。
最初のステップ: 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 進数文字列表現に変換します。