我从C#的字符串编码器中得到以下行为:
[测试用例截图] [1]
poundFromBytes应为“£”,而是“?”。
就好像它正在尝试使用ASCII而不是UTF-8编码字节数组。
这是Windows 7 / C#的字符串编码器中的错误,还是我错过了什么?
我真正的问题是,当我在ANSI文本文件上使用File.ReadAllText时遇到同样的问题,我在第三方库中遇到了相关问题。
修改
我发现了我的问题,我是在假设UTF-8向后兼容ANSI的情况下运行的,但它实际上只是向后兼容ASCII。无论如何干杯,至少我知道确保下次我的测试用例没有非实质性问题。
答案 0 :(得分:1)
井号的单字节表示无效UTF-8。
改为使用Encoding.GetBytes:
byte[] poundBytes = Encoding.GetEncoding("UTF-8").GetBytes(sPound)
答案 1 :(得分:0)
如果您想使用编码的GetString()
方法,您可能还应该使用相应的GetBytes()
方法:
static void Main(string[] args)
{
char cPound = '£';
byte bPound = (byte)cPound; //not really valid
string sPound = "" + cPound;
byte[] poundBytes = Encoding.UTF8.GetBytes(sPound);
string poundFromBytes = Encoding.UTF8.GetString(pountBytes);
Console.WriteLine(poundFromBytes);
Console.ReadKey(True);
}
答案 2 :(得分:0)
查看此处的文件。正如评论中所提到的,您不能只将char
转换为一个字节。我将使用更简洁的答案进行编辑,但我想避免复制/粘贴msdn所具有的内容。 http://msdn.microsoft.com/en-us/library/ds4kkd55(v=vs.110).aspx
char[] pound = new char[] { '£' };
byte[] poundAsBytes = Encoding.UTF8.GetBytes(pound);
另外,为什么每个人都使用带有硬编码参数的GetEncoding而不是直接访问UTF8?
答案 3 :(得分:0)
正确的代码块应该是这样的:
var testChar = '£';
var bytes = Encoding.UTF32.GetBytes(new []{testChar});
string testConvert = Encoding.UTF32.GetString(bytes, 0, bytes.Length);
正如其他人所说,你需要使用UTF编码器来获取字符的字节。顺便提一下,默认情况下字符是UTF-16格式(请参阅:http://msdn.microsoft.com/en-us/library/x9h8tsay.aspx)