我已经跟踪了一个问题,我在.NET System.Text.Encoding类中遇到了以下无法解释的行为:
byte[] original = new byte[] { 128 };
string encoded = System.Text.Encoding.UTF8.GetString(original);
byte[] decoded = System.Text.Encoding.UTF8.GetBytes(encoded);
Console.WriteLine(original[0] == decoded[0]);
我是否期望过多的解码应该等于上面原来的?
UTF8,UTF7,UTF32,Unicode和ASCII都会产生各种各样的错误。发生了什么事?
答案 0 :(得分:4)
这是无效的UTF8字节序列。
你需要
byte[] original = new byte[] { 0xc2, 128 };
与字节顺序标记无关。
<强>更新强>
或者你应该做
char[] c = { (char)128 };
答案 1 :(得分:4)
原始数据是无效的UTF8序列。
decoding = {0xef,0xbf,0xbd}
正在搜索此字符串:http://en.wikipedia.org/wiki/Unicode_Specials。它是替换字符的UTF-8代码,用于代替无效字符。
答案 2 :(得分:1)
这是因为当你转换为字符串时,它将包含UTF-8 BOM,它们在开头是三个字节。
答案 3 :(得分:1)
一般情况下,您不能以这种方式进行往返,并且您希望能够对任意编码执行此操作,特别是对于任何UTF编码都是错误的。
然而,有一个编码可以让你往返所有字节值 - Latin1又名ISO-8859-1又名CP28591。此编码与默认的Windows ANSI编码类似但不完全相同,并且对于以这种方式进行往返的情况非常有用 - 例如编写将文本和控制字符混合到串口的流。
See this answer,或提及Latin1的其他问题。