2012-12-21 85 views
10

在我的C#代碼中,我從PDF文檔中提取文本。當我這樣做時,我得到一個UTF-8或Unicode編碼的字符串(我不知道是哪一個)。當我使用Encoding.UTF8.GetBytes(src);將其轉換爲一個字節數組,我注意到空白實際上是兩個字符的194字節值和160如何修復空格的UTF編碼?

例如字符串「CLE行動」的模樣

[67, 76, 69, 194 ,160, 65 ,99, 116, 105, 111, 110] 

在一個字節數組中,空格是194和160 ...因爲這個src.IndexOf("CLE action");在我需要它返回時返回-1。

如何修復字符串的編碼?

回答

17

194 160是一個NO-BREAK SPACE代碼點(與HTML調用 相同的代碼點)的UTF-8編碼。

所以它真的不是一個空間,即使它看起來像一個。 (例如,你會發現它不會自動換行。)與\s匹配的正則表達式匹配它,但與空格的簡單比較不會。

爲了簡單地取代NO-BREAK空間可以執行以下操作:

src = src.Replace('\u00A0', ' '); 
+0

我該如何用一個普通的空間來替換一個不間斷的空間? – omega

+4

@omega:src = src.Replace('\ u00A0',''); – RichieHindle

1

解讀\xC2\xA0(= 194, 160)作爲UTF8實際上產生\xA0它是Unicode 不間斷空格。這是一個不同於普通空間的特性,因此與普通空間不符。您必須匹配非破壞空間或對任何空格使用模糊匹配。

1

在UTF8字符值C2 A0(194 160)被定義爲NO-BREAK SPACE。根據ISO/IEC 8859,這是一個不允許插入換行符的空間。通常情況下,文本處理軟件假定可以在任何空白字符處插入換行符(這是通常如何實現換行的)。您應該能夠簡單地用正常空間替換字符串中的字符以解決問題。

+0

如何編寫字符串替換功能? – omega

+1

@omega:src = src.Replace('\ u00A0',''); – RichieHindle