1. 程式人生 > >python去除\ufeff、\xa0、\u3000

python去除\ufeff、\xa0、\u3000

今天使用python處理一個txt檔案的時候,遇到幾個特殊字元:\ufeff、\xa0、\u3000,記錄一下處理方法

程式碼:
with open(file_path, mode='r') as f:
s = f.read()

1.\ufeff 位元組順序標記

去掉\ufeff,只需改一下編碼就行,把UTF-8編碼改成UTF-8-sig
with open(file_path, mode='r', encoding='UTF-8-sig') as f:
s = f.read()

2.\xa0 是不間斷空白符

\xa0 是不間斷空白符  
我們通常所用的空格是 \x20 ,是在標準ASCII可見字元 0x20~0x7e 範圍內。
而 \xa0 屬於 latin1 (ISO/IEC_8859-1)中的擴充套件字符集字元,代表空白符nbsp(non-breaking space)。
latin1 字符集向下相容 ASCII ( 0x20~0x7e )。通常我們見到的字元多數是 latin1 的,比如在 MySQL 資料庫中。

去除\xa0
str.replace(u'\xa0', u' ')

3.\u3000 是全形的空白符
根據Unicode編碼標準及其基本多語言面的定義, \u3000 屬於CJK字元的CJK標點符號區塊內,是空白字元之一。它的名字是 Ideographic Space ,有人譯作表意字空格、象形字空格等。顧名思義,就是全形的 CJK 空格。它跟 nbsp 不一樣,是可以被換行間斷的。常用於製造縮排, wiki 還說用於擡頭,但沒見過。

去除\u3000
str.replace(u'\u3000',u' ')
去除空格和\xa0、\u3000
title.strip().replace(u'\u3000', u' ').replace(u'\xa0', u' ')

ps:關於 \ufeff 的一些資料(引自維基百科):

位元組順序標記(英語:byte-order mark,BOM)是位於碼點U+FEFF的統一碼字元的名稱。當以UTF-16或UTF-32來將UCS/統一碼字元所組成的字串編碼時,這個字元被用來標示其位元組序。它常被用來當做標示檔案是以UTF-8、UTF-16或UTF-32編碼的記號。

字元U+FEFF如果出現在位元組流的開頭,則用來標識該位元組流的位元組序,是高位在前還是低位在前。如果它出現在位元組流的中間,則表達零寬度非換行空格的意義,使用者看起來就是一個空格。從Unicode3.2開始,U+FEFF只能出現在位元組流的開頭,只能用於標識位元組序,就如它的名稱——位元組序標記——所表示的一樣;除此以外的用法已被捨棄。取而代之的是,使用U+2060來表達零寬度無斷空白。

在UTF-16中,位元組順序標記被放置為檔案或字串流的第一個字元,以標示在此檔案或字串流中,以所有十六位元為單位的字碼的尾序(位元組順序)。

如果十六位元單位被表示成大尾序,這位元組順序標記字元在序列中將呈現0xFE,其後跟著0xFF(其中的0x用來標示十六進位制)。
如果十六位元單位使用小尾序,這個位元組序列為0xFF,其後接著0xFE。
而統一碼中,值為U+FFFE的碼位被保證將不會被指定成一個統一碼字元。這意味著0xFF、0xFE將只能被解釋成小尾序中的U+FEFF(因為不可能是大尾序中的U+FFFE)。

UTF-8則沒有位元組順序的議題。UTF-8編碼過的位元組順序標記則被用來標示它是UTF-8的檔案。它只用來標示一個UTF-8的檔案,而不用來說明位元組順序。[1]許多視窗程式(包含記事本)會新增位元組順序標記到UTF-8檔案。然而,在類Unix系統(大量使用文字檔案,用於檔案格式,用於程序間通訊)中,這種做法則不被建議採用。因為它會妨礙到如解譯器指令碼開頭的Shebang等的一些重要的碼的正確處理。它亦會影響到無法識別它的程式語言。如gcc會報告原始碼檔開頭有無法識別的字元。而在PHP中,如果沒有啟用輸出緩衝(output buffering),它會使得頁面內容開始被送往瀏覽器(即:使用者標頭檔案已被提交),這使PHP指令碼無法指定使用者標頭檔案(HTTP Header)。位元組順序標記在UTF-8中被表示為序列EF BB BF,對大部分未準備好處理UTF-8的文字編輯器及網頁瀏覽器而言,在ISO-8859-1的環境中則會顯示。

雖然位元組順序標記亦可以用於UTF-32,但這個編碼很少用於傳輸,其規則如同UTF-16。對於已於IANA註冊的字符集UTF-16BE、UTF-16LE、UTF-32BE和UTF-32LE等來說,不可使用位元組順序標記。文件開頭的U+FEFF會被解釋成一個(已捨棄的)"零寬度無斷空白",因為這些字符集的名字已決定了其位元組順序。對於已註冊字符集UTF-16和UTF-32來說,一個開頭的U+FEFF則用來表示位元組順序。

done!