我只是看StreamReader / Writer的构造函数,我注意到它默认使用UTF8。有谁知道这是为什么?我原以为默认使用Unicode会更安全。
答案 0 :(得分:6)
UTF-8可以与任何ASCII文档一起使用,并且通常比UTF-16更紧凑 - 但它仍然涵盖了整个Unicode。我会说UTF-8比UTF-16更常见远。它也是XML的默认值(当没有BOM并且没有指定显式编码时)。
为什么你认为默认为UTF-16会更好? (那就是Encoding.Unicode
。)
答案 1 :(得分:6)
UTF8 是 Unicode,更具体地说是Unicode编码类型之一。
更重要的是它向后兼容ASCII,加上它是XML和HTML的标准默认值
答案 2 :(得分:2)
答案 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的文件,情况可能并非如此。