【问题标题】:StreamReader possible encoding issuesStreamReader 可能的编码问题
【发布时间】:2016-01-18 22:46:20
【问题描述】:

我在使用 StreamReader 读取 C# 中的文件时遇到问题。我有一个 UTF-8 编码的文件。作为示例,我将其简化为一行。单行中有一个换行符。我正在使用 UTF-8 编码阅读,但是一旦读取了字符串,它似乎并没有正确处理换行符。让我举个例子

using (StreamReader sr = new StreamReader(file, Encoding.UTF8))
{
    string line;

    while ((line = sr.ReadLine()) != null)
    {
        Debug.WriteLine("test1\ntest2" + " - " + "test1\ntest2".GetHashCode());
        Debug.WriteLine(line + " - " + line.GetHashCode());
    }
}

这是文件的内容

test1\ntest2

这是这段代码的输出

test1
test2 - -61586127
test1\ntest2 - -228288099

在从字符串文字打印的行中,它在打印时将 \n 视为换行符。当它打印从文件中读取的行时,它不会这样做。还可以看到哈希码值不同。

【问题讨论】:

  • 不一样的!在文件内容中,“\n”是一个文本,在 c# 代码中,“\n”是一个换行符,因为字符“\”是一个转义字符,它告诉编译器下面的字符是“特殊的”。如果使用“\t”,则表示制表符
  • “\n”是文件的实际内容(例如,'\' 的 ascii 码 92,'n' 的 ascii 码 110)还是换行符 0x0A?
  • 您的文件中是否实际写入了“\n”(反斜杠和字母 n),或者它是换行符,而您只是这样显示它?是编译器将字符串中的“\n”等特殊转义序列转换为换行符。当从文件中读取这样一个序列时,它只是“反斜杠和字母n”,不会自动转换为换行符。

标签: c# encoding utf-8 streamreader


【解决方案1】:

您的文件内容有误。在 C# 中,当使用文字字符串时,带有 \ 前缀的字符被视为特殊字符(例如,\n 用于 NewLine,\r 用于回车,\t 用于制表符等)。这称为转义,\ 是转义字符。 \ 和一些附加字符的序列导致字符串中的最后一个字符。

虽然在您的文件内容中有两个实际字符(\n),但它们被视为实际字符而不是特殊字符。因此,在您的文件中,您实际上需要在从流中读取后放入换行符或将 \n 替换为实际 C# 的 \n

【讨论】:

  • 我不知道为什么我没有想到这一点。我只是习惯于将 \n 视为换行符,我没想到从文件中读取它时不会被视为转义序列。
  • 是的,这也让我有好几次 ;) 很高兴为您提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2021-01-17
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2016-02-19
相关资源
最近更新 更多