• 编程杂谈——Non-breaking space


    近日,意外地遇上件不寻常的事情。在解析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 
    

    可以看到两者的差异在于20C2 A0

    Ascii表可知,20正是表示空格。

    C2 A0则代表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中开启了显示空格选项,这两种空格在编辑器中也是看不出区别的。

  • 相关阅读:
    openSUSE字体美化
    [转摘]关于创建oracle dblink 过程的几点心得
    IList及泛型集合类转换DataTable
    C# 编码规范和编程好习惯
    随机数和随机字符串
    ThrowActivity 光阴的故事
    数据库的数据 转化为XML 在页面上浏览 光阴的故事
    EventHandlingScopeActivity 光阴的故事
    workflow 角色的使用关键 光阴的故事
    ConditionedActivityGroup 光阴的故事
  • 原文地址:https://www.cnblogs.com/kenwoo/p/11355173.html
Copyright © 2020-2023  润新知