【发布时间】:2011-09-12 22:18:09
【问题描述】:
您好,我注意到当我使用 UTF-8 编码(无 BOM)保存文本文件时,我能够使用 C# 上的 UTF-16 编码完美地读取它。现在这让我有点困惑,因为 UTF-8 只使用 8 位,对吧?而且 utf-16 每个字符占用 16 位。
现在假设我在这个文件中以 UTF-8 格式写入字符串“ab”,那么字母“a”有一个字节,“b”有另一个字节。
好的,但是如何在使用 UTF-16 字符集时读取这个 UTF-8 文件?在我看来,在读取文件时,“ab”的两个字节会被误认为只有一个包含两个字节的字符。因为 UTF-16 需要这 2 个字节。
我是这样读的(t.txt 编码为 UTF-8):
using(StreamReader sr = new StreamReader(File.OpenRead("t.txt"), Encoding.GetEncoding("utf-16")))
{
Console.Write(sr.ReadToEnd());
Console.ReadKey();
}
【问题讨论】:
-
UTF-8 在处理英语时使用 8 位 - 但如果处理其他语言,UTF-8 可能是 16、24 甚至更多位。
-
UTF-16 需要 2 或 4 个字节。
-
@Sai,哦,我以为 utf-8 总是 8 位长,而当使用 16 位时,它会被称为 utf-16。所以我可以有 16 位并且仍然使用 utf-8 而不是 utf-16?
-
@tchris 好的,但是如果 utf-16 至少需要 2 个字节,并且编码为 utf-8 的文件可能只有 1 个字节的字符。解码为 utf-16 时它是如何工作的?当他知道字符只使用引擎盖下的 1 个字节时,它是否只是添加了一个 0x00 字节?但如果他这样做了,那么与 utf-8 没有区别。我不明白。
-
@Delta 与 UTF-8 不同的字符可能有不同的长度。例如,常规英文字符将占用 8 位,但其他字符集(例如泰米尔语)将占用更多位。你可以看看joelonsoftware.com/printerFriendly/articles/Unicode.html——里面有很好的解释。
标签: c# encoding utf-8 utf-16 utf