近日,意外地遇上件不尋常的事情。在解析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表可知,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中開啟了顯示空格選項,這兩種空格在編輯器中也是看不出區別的。