2017-06-22 20 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查看字符限制是如何解決的,以及爲什麼它不會出現在任何地方。