我正在阅读具有以下结构的文本文件:
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"
有没有办法获得这个? 提前致谢!此致!
答案 0 :(得分:3)
您正在Visual Studio调试器中观看它,它只是以这种方式显示您的行。您可以将结果写入控制台或文件中。并且您将看到没有特殊字符的普通文本。
答案 1 :(得分:1)
StreamReader
根本不添加或修改从文件中读取的字符串。
如果您正在Visual Studio调试器中查看separador
的内容,它将为任何特殊字符添加转义序列(用于显示目的)。
如果您正在创建字符串常量,则显示的格式与您在代码编辑器中输入它们的方式相匹配。
例如,
但是,这些字符串(在内存中)的实际内容不会被转义。它们正如您所期望的那样在您的问题中。
如果您输出它们或尝试在代码中操作它们,它们将具有正确的内容。
所以,你的代码是正确的。您只需要了解escape sequences以及字符串在Visual Studio调试器中的显示方式。
<强>更新强>
有关如何在调试器中显示未加引号的字符串的说明,请参阅this question。
答案 2 :(得分:0)
好的,这是来自MSDN
的报价在编译时,逐字字符串将转换为具有所有相同转义序列的普通字符串。因此,如果在调试器监视窗口中查看逐字字符串,您将看到编译器添加的转义字符,而不是源代码中的逐字字符。例如,逐字字符串@&#34; C:\ files.txt&#34;将在观察窗口中显示为&#34; C:\ files.txt&#34;。
对于"
的情况,它使用\" (
逐字字符串)
,这在调试时可见。
为什么会这样?
双引号"
是escape sequence
转义序列通常用于指定终端和打印机上的回车和标签移动等操作。它们还用于提供通常具有特殊含义的非打印字符和字符的文字表示,例如双引号(&#34;)
因此,当字符串故意包含转义序列时,您需要将其表示为verbatim string
。这就是编译器所做的以及您在调试器中看到的内容