20

在我的 C# 代码中,我从 PDF 文档中提取文本。当我这样做时,我得到一个 UTF-8 或 Unicode 编码的字符串(我不确定是哪个)。当我Encoding.UTF8.GetBytes(src);将其转换为字节数组时,我注意到空格实际上是两个字节值分别为 194 和 160 的字符。

例如字符串“CLE action”看起来像

[67, 76, 69, 194 ,160, 65 ,99, 116, 105, 111, 110]

在一个字节数组中,其中的空格是 194 和 160... 因为这src.IndexOf("CLE action");是在我需要它返回 1 时返回 -1。

如何修复字符串的编码?

4

3 回答 3

32

194 160是代码点的 UTF-8 编码NO-BREAK SPACE(与 HTML 调用的代码点相同 )。

所以它真的不是一个空间,即使它看起来像一个空间。(例如,您会看到它不会自动换行。)正则表达式匹配 for\s会匹配它,但与空格的简单比较不会匹配。

要简单地替换 NO-BREAK 空格,您可以执行以下操作:

src = src.Replace('\u00A0', ' ');
于 2012-12-21T15:40:43.263 回答
3

在 UTF8 字符值 c2 a0 (194 160) 中定义为 NO-BREAK SPACE。根据 ISO/IEC 8859,这是一个不允许插入换行符的空格。通常文本处理软件假定可以在任何空白字符处插入换行符(这是通常实现自动换行的方式)。您应该能够简单地用普通空格替换字符串中的字符来解决问题。

于 2012-12-21T15:45:56.373 回答
2

\xC2\xA0将(= )解释194, 160为 UTF8 实际上会产生\xA0unicode non-breaking space。这是与普通空格不同的字符,因此与普通空格不匹配。您必须匹配不间断空格或对任何空格使用模糊匹配。

于 2012-12-21T15:40:30.877 回答