0

举个例子:

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 编码不能写 £ 符号吗?

4

3 回答 3

3

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

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

如果您必须使用 ASCII,请考虑使用此处提到的用于英镑的“ GBP ”。(也可能是相关的:扩展 ASCII。)

于 2017-06-22T20:59:56.117 回答
1

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

查看这篇文章代码页上的这篇文章,了解字符限制是如何解决的,并了解为什么它不会出现在任何地方。

于 2017-06-22T21:33:57.443 回答
1

正如 Hans 所指出的,ASCII 是为美国人设计的,只使用 0-127 的代码点,英语世界中微不足道的其他人可以忍受这一点,除非他们尝试使用像 £ 这样的晦涩符号,代码点在 0-127 范围之外。我想你住在英国,只针对来自英国或西欧的客户。不要使用Encoding.ASCII,但Encoding.Default它是英国的代码页 1252,当然不是在土耳其。对于 ASCII 范围 0-127 中的每个字符,您可以获得真正的 ASCII,但也可以使用磅符号所在的 128-255 范围内的字符。但请注意,如果假设文件以 UTF8 编码试图读取该文件,则 £ 符号将掩盖内容,因为它包含 UTF8 中不存在的字节。这由一些奇怪的字形表示,如�。

于 2020-04-23T13:17:38.013 回答