在我的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。
如何修复字符串的编码?
答案 0 :(得分:21)
194 160
是NO-BREAK SPACE
代码点的UTF-8编码(与HTML调用
相同的代码点)。
所以它真的不是一个空间,即使它看起来像一个。 (例如,你会发现它不会自动换行。)\s
的正则表达式匹配会与之匹配,但与空格的简单比较则不会。
要简单地替换NO-BREAK空间,您可以执行以下操作:
src = src.Replace('\u00A0', ' ');
答案 1 :(得分:2)
将\xC2\xA0
(= 194, 160
)解释为UTF8实际上会产生\xA0
,这是unicode 非中断空间。这是与普通空间不同的字符,因此与普通空间不匹配。您必须匹配不间断的空格或对任何空格使用模糊匹配。
答案 2 :(得分:2)
在UTF8中,字符值c2 a0(194 160)被定义为NO-BREAK SPACE。根据ISO / IEC 8859,这是一个不允许插入断线的空间。通常,文本处理软件假定可以在任何空格字符处插入换行符(这是正常实现自动换行的方式)。你应该能够简单地用正常空格替换你的字符串来解决问题。