7

我用谷歌搜索了编码。我发现在 C# 中不推荐使用默认编码。完整的消息是:

不同的计算机可以使用不同的编码作为默认编码,甚至可以在单台计算机上更改默认编码。因此,从一台计算机流式传输到另一台计算机或什至在同一台计算机上的不同时间检索的数据可能会被错误地翻译。此外,默认属性返回的编码使用最佳匹配回退将不受支持的字符映射到代码页支持的字符。由于这两个原因,一般不建议使用默认编码。为确保正确解码编码字节,您的应用程序应使用带有前导码的 Unicode 编码,例如 UTF8Encoding 或 UnicodeEncoding。另一种选择是使用更高级别的协议来确保编码和解码使用相同的格式。

来源MSDN

但是如何改变计算机的解码?我不清楚“不同的计算机可以默认使用不同的编码”这一位。

4

2 回答 2

8

上个世纪的许多软件都使用单个字节来存储字符。不知道 Unicode 的要求。一个字节只能提供 256 个不同的值,因此此类软件只能处理具有有限数量的不同字符的文本。

几乎每个人都同意字节值 0 到 127 代表什么字符,它们是 ASCII 字符集中的字符。1960 年代初期的一种标准,为英文字母表中的字母和符号赋值。

这留下了另外 128 个未分配的值。难点在于,它们可以在不同的地方表示不同的字符,用来表示非英文字形。例如在希腊语和俄语等不使用拉丁字母的语言中是必需的。或者越南语和波兰语,这些语言有拉丁字母,但使用大量变音符号来标记不同的声音。尤其是对于具有非常大字母的语言,如中文、韩文和日文,尤其令人费解。此类语言需要双字节编码技巧来将字母表压缩为 128 个值。

字节值到字符的映射称为代码页。有许多代码页。即使是单一语言。例如,可以在代码页 437(旧的 IBM-PC 字符集)中对英语进行编码。具有绘图字符的独特之处,通常用于旧的 DOS 软件,并且仍然是控制台模式程序的默认设置。还有代码页 1252,这是一个 ANSI 代码页,它是西欧和美洲的 Windows 程序的默认设置。以及代码页 28591,ISO 对巴别塔的可爱贡献。我应该提到代码页 37,用于 IBM 的 EBCDIC 编码,这是一种非 ASCII 编码,它在 IBM 销售大型​​计算机方面的实力得以幸存。否则,历史上一个值得注意的事故将一个字节的大小标准化为 8 位。还有代码页 65001,结束它们的代码页,UTF-8 的代码页,

这是不好的。无法从文本文件中分辨出哪个代码页用于对文件中的文本进行编码。你必须对此做出有根据的猜测。如果你猜错了,那你只会胡说八道。

Encoding.Default 将使用机器的默认 ANSI 编码,在控制面板的区域和语言小程序中配置,“非 Unicode 程序的语言”设置。从默认值更改它是非常不明智的,这大大增加了旧程序从文本文件中产生废话的可能性。西欧和美洲的代码页为 1252,使用西里尔字母的语言为 1251,希腊语为 1253,阿拉伯语为 1256,等等。清单在这里

您可以通过尽可能避免 Encoding.Default 来避免这种痛苦。并支持 UTF-8,这是一种 Unicode 编码,与 .NET 对 Unicode 的支持非常配合。并且是 StreamWriter 和 File 等类的默认设置。并且能够在文件的开头编写一个 BOM,3 个不同的字节指示用于文本的编码,以便其他程序可以看到您使用的编码。仅当您背井离乡并被迫使用旧版软件时才考虑另一种编码。

于 2013-09-18T12:35:08.167 回答
1

编码通常表示您使用的是哪个字符集。大多数时候使用 utf-8,但例如,中文符号需要 utf-16 表示为单个符号(更多字符)。

所以谷歌的意思是:你应该指定你想使用的字符集,而不是假设客户端将使用 utf-8。例如 xml 文件的第一行:

<?xml version="1.0" encoding="utf-8"?>
于 2013-09-18T07:55:03.070 回答