C#读取文件添加特殊字符

时间:2015-02-24 13:06:07

标签: c# split streamreader

我正在阅读具有以下结构的文本文件:

  

20150218;" C7&#34 ;;" B895&#34 ;; 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&#34 ;; \" C7 \&#34 ;; \" B895 \&#34 ;;" 00101&#34 ;; \" FTBCCAL16 \"

如您所见,流读取器为输出添加了一些特殊字符,如""和\。我想获得这个。

  

20150218;" C7&#34 ;;" B895&#34 ;; 00101;" FTBCCAL16"

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

如果您正在创建字符串常量,则显示的格式与您在代码编辑器中输入它们的方式相匹配。

例如, Debugger output


但是,这些字符串(在内存中)的实际内容不会被转义。它们正如您所期望的那样在您的问题中。

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

Console output


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


<强>更新

有关如何在调试器中显示未加引号的字符串的说明,请参阅this question

答案 2 :(得分:0)

好的,这是来自MSDN

的报价
  

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

对于"的情况,它使用\" (逐字字符串),这在调试时可见。

为什么会这样?

双引号"escape sequence

  

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

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