C#的字符串格式化程序出了什么问题?

时间:2013-12-05 17:37:57

标签: c# character-encoding

我从C#的字符串编码器中得到以下行为:

[测试用例截图] [1]

poundFromBytes应为“£”,而是“?”。

就好像它正在尝试使用ASCII而不是UTF-8编码字节数组。

这是Windows 7 / C#的字符串编码器中的错误,还是我错过了什么?

我真正的问题是,当我在ANSI文本文件上使用File.ReadAllText时遇到同样的问题,我在第三方库中遇到了相关问题。

修改

我发现了我的问题,我是在假设UTF-8向后兼容ANSI的情况下运行的,但它实际上只是向后兼容ASCII。无论如何干杯,至少我知道确保下次我的测试用例没有非实质性问题。

4 个答案:

答案 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