我只是在查看 StreamReader / Writer 的构造函数,我注意到它默认使用 UTF8。有谁知道这是为什么?我原以为默认使用 Unicode 会更安全。
4 回答
UTF-8 将适用于任何 ASCII 文档,并且通常比 UTF-16 更紧凑——但它仍然涵盖了整个 Unicode。我想说 UTF-8比UTF-16 更常见。它也是 XML 的默认值(当没有 BOM 并且没有指定显式编码时)。
为什么您认为默认使用 UTF-16 会更好?(就是这样Encoding.Unicode
。)
编辑:我怀疑你对 UTF-8 到底能处理什么感到困惑。这个页面描述得很清楚,包括任何特定的 Unicode 字符是如何编码的。这是一种可变宽度编码,但它涵盖了整个 Unicode。
UTF8是Unicode,更具体地说是 Unicode 编码类型之一。
更重要的是它向后兼容 ASCII,而且它是 XML 和 HTML 的标准默认设置
正如所有其他人已经说过的,UTF-8 是 Unicode 中的一种编码标准。UTF-8 使用可变数量的字节来编码所有的 unicode 字符。
所有 ASCII 字符都按原样表示,因此现在可以轻松读取 ASCII 文件。一旦流中的一个字节设置了它的第 8 位(最高位,> 127),就会触发阅读器将其与下一个字节组合,直到小于 128。则该组合被视为 1 个字符。
LATIN-1 (ANSII) 中有一些字符使用两个字符进行编码:例如 é 被编码为 e 和 ´。因此长度('é') 为 2。
Windows 内部使用 UTF-16,它将可编码字符限制为 64K,这绝不是所有 Unicde 字符。UTF-32 暂时允许所有字符,但也受到人为限制。并且两者都与 ASCII 不向上兼容,因为它们具有前导零:
A = ASCII h41 = UTF-8 h41 = UTF-16 h0041 = UTF-32 h00000041
还有大小端编码:
A = UTF-16 big endian h0041 = UTF-16 little endian h4100
想象一下使用 UTF16 或 UTF32 来保存您的文件。与 ASCII 和 UTF-8(如果仅使用 ascii 字符,则为 UTF-8)相比,它们(对于文本文件)的大小会增加一倍或四倍。UTF-8 不仅允许 unicode 标准中的所有字符,甚至未来的增强功能,而且还有效地节省了空间。
通常文件的前两个字节,BOM 或字节顺序标记,会告诉您使用哪种编码标准。如您所见,如果省略,XML 和 StreamRedaer 使用 UTF-8。这又是有意义的,因为 ASCII 文件没有 BOM,因此在大多数情况下都可以正确读取。对于使用所有 LATIN-1 的文件,这可能并非如此。