編程雜談——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中開啟了顯示空格選項,這兩種空格在編輯器中也是看不出區別的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM