从StreamReader.ReadLine()获取的字符串的编码是什么?

7

首先,让我们看看代码:

//The encoding of utf8.txt is UTF-8
StreamReader reader = new StreamReader(@"C:\\utf8.txt", Encoding.UTF8, true);
while (reader.Peek() > 0)
{
    //What is the encoding of lineFromTxtFile?
    string lineFromTxtFile = reader.ReadLine();
}

正如 Joel 在他著名的 文章 中所说:

如果你有一个字符串,无论是在内存中、文件中还是电子邮件中,你都必须知道它使用的编码方式,否则你将无法正确地解释或显示给用户。

所以我的问题来了:字符串 lineFromTxtFile 的编码是什么?UTF-8(因为它来自一个以 UTF-8 编码的文本文件)?还是 UTF-16(因为 .NET 中的字符串是“Unicode”(UTF-16))?

谢谢。

3个回答

6
所有的.Net字符串变量都使用Encoding.Unicode(UTF-16, little endian)进行编码。更好的是,如果您知道您的文本文件是utf-8并在构造函数中告诉了您的streamreader正确的编码方式,那么任何特殊字符都将被正确处理。

2

.NET字符串是Unicode编码的。编码并不重要,直到下一步需要使用它时才需要考虑。例如,如果您要将其写入文件,则需要指定输出编码。但由于.NET通过库调用处理字符串的所有操作,因此内存中表示的方式并不重要。


那么如果我想将这个字符串转储到文件中,StreamWriter writer = new StreamWriter(@"C:\unicide.txt",false, Encoding.Unicode);writer.WriteLine(lineFromTxtFile ) - jjooeell
1
@jjooeell,你给流写入器提供的编码与字符串在内存中的存储方式无关。它用于将字符转换为字节,而不是将字节转换为字节。 - Ilia G
同意。您在那里指定的编码方式告诉它如何被写入磁盘,而不是内存中已经存在的内容。 - Jonathon Reinhart
这个答案不是很准确,所有的Unicode字符串都是编码的。.NET字符串使用UTF16编码,在大多数机器上是最小端编码。 - Hans Passant

1

它将是Unicode,因为所有.NET字符串都是Unicode。真正的问题是: 这为什么要紧?


为了证明这些代码是不必要的:byte[] dataByte = .Encoding.UTF8GetBytes(lineFromTxtFile);string strOutLine = Encoding.Unicode.GetString(dataByte); - jjooeell
@jjooeell,我不确定你在说什么。 - Ilia G
因为lineFromTxtFile已经是一个“Unicode”(UTF-16)字符串,所以不需要进行转换(UTF-8-->byte[]-->UTF-16)。 - jjooeell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接