为什么.NET Framework StreamReader / Writer默认为UTF8编码?

时间:2009-05-13 09:32:58

标签: .net encoding streamreader streamwriter

我只是看StreamReader / Writer的构造函数,我注意到它默认使用UTF8。有谁知道这是为什么?我原以为默认使用Unicode会更安全。

4 个答案:

答案 0 :(得分:6)

UTF-8可以与任何ASCII文档一起使用,并且通常比UTF-16更紧凑 - 但它仍然涵盖了整个Unicode。我会说UTF-8比UTF-16更常见。它也是XML的默认值(当没有BOM并且没有指定显式编码时)。

为什么你认为默认为UTF-16会更好? (那就是Encoding.Unicode。)

编辑:我怀疑你对UTF-8可以处理的内容感到困惑。 This page非常清楚地描述了它,包括如何编码任何特定的Unicode字符。它是一种可变宽度编码,但它涵盖了整个Unicode。

答案 1 :(得分:6)

UTF8 Unicode,更具体地说是Unicode编码类型之一。

更重要的是它向后兼容ASCII,加上它是XML和HTML的标准默认值

答案 2 :(得分:2)

“Unicode”是标准的名称,因此没有“Unicode”这样的编码。相反,有两种映射方法:UTFUCS

对于“为什么”部分,UTF-8与ASCII具有最大兼容性。

答案 3 :(得分:2)

正如所有其他人已经说过的那样,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的文件,情况可能并非如此。