2017-06-22 81 views
0

看看下面的例子:WriteAllText,字符编码,£和?

string testfile1 = Path.Combine(HttpRuntime.AppDomainAppPath, "folder\\" + "test1.txt"); 
if (!System.IO.File.Exists(testfile1)) 
{ 
    System.IO.File.WriteAllText(testfile1, "£100", System.Text.Encoding.ASCII); 
} 

string testfile2 = Path.Combine(HttpRuntime.AppDomainAppPath, "folder\\" + "test2.txt"); 
if (!System.IO.File.Exists(testfile2)) 
{ 
    System.IO.File.WriteAllText(testfile2, "£100", System.Text.Encoding.UTF8); 
} 

注意的编码。第一个输出是100。第二个输出100英镑。

我知道编码是不同的,但有人可以解释为什么ASCII编码不能写英镑?

+2

呵呵,当你住在英格兰时,“£”字形只会在ASCII字符集中出现。对不起,ASCII中的A意味着“美国人”。考虑“$”。 –

+0

除非你遵循特别要求ASCII的规范,否则它很少是正确的选择。 (而且,在“ASCII”这个词的许多用法中,ASCII字符集甚至不是实际意义上的。)考虑[Unicode]的UTF-8编码(http://www.unicode.org/charts/ nameslist/index.html)字符集 - 所有.NET,Java,JavaScript,...字符串都是Unicode。 HTML XML,JSON,Java,C#,...文件都是Unicode(一旦解码,无论如何)。但是,无论您选择多少种编码作为文件编写者,您都必须告诉读者哪一个阅读文本文件。 –

+1

哦,而不是'Encoding.ASCII',试试这个:'Encoding.GetEncoding(“US-ASCII”,EncoderExceptionFallback.ExceptionFallback,DecoderExceptionFallback.ExceptionFallback)''。 (我非常喜欢无声数据丢失的例外情况,或者在您的情况下损失100英镑。) –

回答

3

ASCII不包括“”,“”字符。也就是说 - 没有字节值(也不是多字节值 - 它们不存在于ASCII中)表示该符号。所以它会告诉你一个“”。另一方面,UTF8包含它。

请参阅here ASCII中所有可打印字符的列表。

如果您必须使用ASCII码,请考虑使用“英镑”,如here英镑。 (也可能相关:Extended ASCII。)

1

要处理ASCII和某些字符,它很大程度上依赖于您使用的代码页。 £不是在拉丁字母中普遍需要或使用的字符,因此没有出现在标准ASCII集中。

查看at this articlethis one on code pages查看字符限制是如何解决的,以及为什么它不会出现在任何地方。