程式設計雜談——Non-breaking space

Ken.W發表於2019-08-14

近日,意外地遇上件不尋常的事情。在解析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文件的出處源自芬蘭吧。

程式設計雜談——Non-breaking space

順便提一句,即使在Visual Studio中開啟了顯示空格選項,這兩種空格在編輯器中也是看不出區別的。

程式設計雜談——Non-breaking space

相關文章