近日, 意外地遇上件不寻常的事情. 在解析 PDF 文件, 读取其中内容的时候, 对某一文件的处理, 始终无法达到预期的效果.
解析方法如下:
- public void Parse(string value)
- {
- if (value == "General Information")
- {
- ...
- }
- }
经调试发现此时传入的参数值是 General Information, 但在实际执行时并未进入到 if (value == "General Information") 条件语句内. 这是件怪事.
将条件值与传入值分别拷贝出来, 再放到一段简单的测试代码中, 会看到结果显示为 False. 说明这两个真的不是等同的值.
- class Program
- {
- static void Main(string[] args)
- {
- var a = "General Information";
- var b = "General Information";
- var eq = a == b;
- Console.WriteLine(eq);
- }
- }
认真检查了一遍拼写, 发现无误后, 将字符串转成十六进制再调查.
General Information 转换为以下结果:
47 65 6E 65 72 61 6C 20 49 6E 66 6F 72 6D 61 74 69 6F 6E
而 General Information 的结果是这样的:
47 65 6E 65 72 61 6C C2 A0 49 6E 66 6F 72 6D 61 74 69 6F 6E
可以看到两者的差异在于 20 与 C2 A0.
由 Ascii 表 http://www.asciitable.com/ 可知, 20 正是表示空格.
C2 A0 则代表 Non-breaking space https://en.wikipedia.org/wiki/Non-breaking_space , 是在 UTF-8 编码下的一种特殊的空格, 意指换行时阻止空格两端文字被断开.
举个简单的例子, 文字 100 km 如果出现在行末, 当需要换行处理时, 很可能会自动将 100 留在当前行末, 而 km 被移到下一行首. 但如果其中间的空格是 Non-breaking space, 那这种情况便不会发生了.
在 Windows 系统上, 通过使用 Alt+0160 或者 Alt+255(数字键都是小键盘上的) 方式能够输入此类型的空格. 但细想下, 极少有可能是人为主动使用这种方式进行输入数据的.
再搜寻了下, 原来在 Finnish multilingual keyboard(芬兰语多语言键盘) 上, 可以通过 AltGr + Space 组合键方便地进行输入 Non-breaking space, 所以大约那份 PDF 文档的出处源自芬兰吧.
顺便提一句, 即使在 Visual Studio 中开启了显示空格选项, 这两种空格在编辑器中也是看不出区别的.
来源: https://www.cnblogs.com/kenwoo/p/11355173.html