如何修复空格的UTF编码?

在我的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。

如何修复字符串的编码?

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

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

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

 src = src.Replace('\u00A0', ' '); 

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

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