【问题标题】:Why am I getting "�" characters?为什么我得到“�”字符?
【发布时间】:2013-07-06 14:27:36
【问题描述】:

我编写了一个快速而简单的实用程序来解析文本文件,但在某些情况下它会写出一个“�”字符。我的实用程序从包含以下格式的“记录”的 .txt 文件中读取:

Biography
Title:George F. Kennan: An American Life 
Author:John Lewis Gaddis
Kindle: B0054TVO1G
Hardcover: B007R93I1U
Paperback: 0143122150
Image link: <a href="https://rads.stackoverflow.com/amzn/click/com/B0054TVO1G" rel="nofollow noreferrer"><img src="http://images.amazon.com/images/P/B0054TVO1G.01.MZZZZZZZ.jpg" alt="Book Cover" /></a> 

...并将其中的行写入 CSV 文件,例如:

Biography,"George F. Kennan: An American Life","John Lewis Gaddis",B0054TVO1G,B007R93I1U,0143122150,<a href="https://rads.stackoverflow.com/amzn/click/com/B0054TVO1G" rel="nofollow noreferrer"><img src="http://images.amazon.com/images/P/B0054TVO1G.01.MZZZZZZZ.jpg" alt="Book Cover" /></a>

...但在某些情况下,如前所述,那个奇怪的字符会将自己附加到作者的名字上。在发生这种情况的大多数情况下,它似乎是 .txt 文件中的空格字符。在将作者姓名写入 CSV 文件之前,我会对其进行修整,因此它显然不会被视为空格。

当我用这些字符保存文本文件时,我收到关于非 unicode 字符等的消息。

这可能是什么原因?更好的是,如何通过搜索和替换操作删除它们?在记事本中,找不到它们,所以我必须一个一个地删除它们。

在 .txt 文件中之前,此数据位于 Open Office/.odt 文件中,如果这对任何人都有意义的话。

顺便说一句,我不知道“stackoverflow”是如何进入上面的 href 的;不是我粘贴的原文...

更新

很好奇这个角色是如何进入我的文件的。我肯定没有(故意)把它放在那里,就像我在上面的 URL 中添加了“stackoverflow”一样。会不会是对 Environment.Newline 的调用会添加它?

这是我的过程:

1) Copy and paste info from the interwebs into an Open Office/.odt file
2) Copy and past that into a text (Notepad) file
3) Open that text file programmatically and loop through it, writing to a new "csv"/.txt file.

更新 2

我真傻 - 我所要做的就是保存文件(不会保存那些奇怪的字符),然后再次打开它。 IOW,当我今天(在家,下班后)打开它时,那些已经不见了。

更新 3

我写得太早了——它用问号代替了奇怪的字符(一个“正常”的,而不是一个程式化的)。

【问题讨论】:

  • 文本文件的编码是什么?如果您以不同的编码读取它,可能无法识别某些字符
  • 它只是一个普通的旧文本文件。我是这样读的: using (StreamReader stromLeser = new StreamReader(fileName)) { string rawLine; while ((rawLine = stromLeser.ReadLine()) != null) { if (!string.IsNullOrEmpty(rawLine)) { rawLines.Add(rawLine.Trim()); } } }
  • 没有“纯旧文本文件”之类的东西......joelonsoftware.com/articles/Unicode.html
  • 我的意思是它可以用 UTF-8 编码,如果你想让它以默认编码(可以是 ANSI)读取它,你可能会错过一些字符。
  • 我所说的“普通旧文本文件”是一个记事本文件,我从中粘贴了 .odt 文件中的内容。我必须在我的实用程序中做什么来适应这种情况?

标签: c# parsing text-parsing odt non-unicode


【解决方案1】:

它们几乎肯定是不间断的空格,U+00A0(尽管还有其他固定宽度的空格字符也是可能的。)这些不会被修剪为空格,但如果编码为该文件与输出设备的编码匹配。

我的猜测是您的文本文件采用 CP-1252(即 Windows 默认的单字节编码),但您的输出被渲染为 UTF-8。

通常您会将这些字符键入为 AltGr+Space。你可以用记事本试试,但不能保证。

【讨论】:

  • 我不确定我在这个键盘上有一个右 Alt 键 - 在右 Windows 键旁边和右边有一个键,但它没有说“Alt”它;相反,它有一个正方形的图标,里面有三行 - 我不知道它是否应该代表一个文档、一个组合框,或者什么......那是“右手的”Alt“键”?
  • @ClayShannon:显然在 Windows 上,您可以使用 ctrl+alt 进行 AltGr,但我无法尝试。此外,如果您有数字键盘,则可以通过按住 alt 键并在数字键盘上键入 十进制 值,然后松开 alt 键来键入任意 unicode 字符。 NBSP 的十进制值为 160。可能还有其他方式。此外,有传言说某些应用程序允许您将 ctrl+shift+space 用于 NBSP。顺便说一句,三行方块应该代表一个菜单;那是“菜单”键。
  • 哦,我想这就像 Chrome 中的“热狗”或其他名称。
猜你喜欢
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多