【问题标题】:C# Reading a file add special charactersC#读取文件添加特殊字符
【发布时间】:2015-04-26 02:59:40
【问题描述】:

我正在阅读具有这种结构的文本文件:

20150218;"C7";"B895";00101;"FTBCCAL16"

我读了这行并像这样拆分:

System.IO.StreamReader fichero = new System.IO.StreamReader(ruta, Encoding.Default);
while ((linea = fichero.ReadLine()) != null)
{
    // Split by ";"
    String[] separador = linea.Split(';');
}

但是当我看到“linea”的内容时,我有这个:

"20150218";\"C7\";\"B895\";"00101";\"FTBCCAL16\"

如您所见,流读取器在输出中添加了一些特殊字符,例如“”和 \。我想得到这个。

20150218;"C7";"B895";00101;"FTBCCAL16"

有没有办法获得这个? 提前致谢!问候!

【问题讨论】:

  • 这就是它在 Visual Studio 中的样子," 用前导 \ 转义。如果您在调试器中单击放大镜,您会看到没有反斜杠。
  • 你怎么看linea?使用 Visual Studio 监视窗口或类似的东西,或者通过将字符串写入控制台窗口,...?
  • 请使用 Console.Write() 查看显示 linea 的内容并再次检查。

标签: c# split streamreader


【解决方案1】:

您正在 Visual Studio 调试器中观看它,它只是以这种方式向您显示您的行。您可以将结果写入控制台或文件中。你会看到没有特殊字符的普通文本。

【讨论】:

    【解决方案2】:

    StreamReader 根本没有添加或修改从文件中读取的字符串。

    如果您在 Visual Studio 调试器中查看 separador 的内容,它将为任何特殊字符添加转义序列(用于显示目的)。

    显示的格式与您在创建字符串常量时必须在代码编辑器中输入它们的方式相匹配。

    例如,


    然而,这些字符串的真实内容(在内存中)并没有被转义。它们与您在问题中所期望的完全一样。

    如果您将它们输出或尝试在代码中对其进行操作,它们将具有正确的内容。


    所以,您的代码是正确的。您只需了解escape sequences 以及字符串在 Visual Studio 调试器中的显示方式。


    更新:

    请参阅this question,了解如何在调试器中显示不带引号的字符串。

    【讨论】:

      【解决方案3】:

      好的,这里是MSDN的报价

      在编译时,逐字字符串被转换为具有所有相同转义序列的普通字符串。因此,如果您在调试器监视窗口中查看逐字字符串,您将看到编译器添加的转义字符,而不是源代码中的逐字版本。例如,逐字字符串@“C:\files.txt”将在监视窗口中显示为“C:\files.txt”。

      在您的" 的情况下,它使用\" (Verbatim string),这可以在调试时看到。

      为什么会这样?

      双引号" 是escape sequence

      转义序列通常用于指定终端和打印机上的回车和制表符移动等操作。它们还用于提供非打印字符和通常具有特殊含义的字符的文字表示,例如双引号 (")

      因此,当一个字符串故意包含转义序列时,您需要将其表示为verbatim string。这就是编译器所做的,这就是你在调试器中看到的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-02
        • 2010-11-14
        • 1970-01-01
        • 2020-05-03
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多