2015-07-22 20 views
5

當我寫氟奮乃靜讀作 XEF 西飛 x82uphenazine

>>> st = "Piperazine (perphenazine, fluphenazine)" 

>>> st 

'Piperazine (perphenazine, \xef\xac\x82uphenazine)' 

這是怎麼回事?爲什麼不爲fl做這個?我如何避免這種情況?

它看起來\ xef \ xac \ x82其實不是,fl。有沒有什麼辦法來「翻譯」這個人物變成FL(如作者的意圖的話),不只是通過一些不包括像

unicode(st, errors='ignore').encode('ascii') 

回答

8

這就是所謂的「連字」。

在打印過程中,f和l字符被排版,它們之間的距離與使用的正常序列字母對之間的距離不同,實際上f和l會合併成一個字符。其他連字包括「th」,「oe」和「st」。

這就是你在輸入中獲得的 - 「fl」連字符,UTF-8編碼。這是一個三字節的序列。我會對你的斷言說「它不是,實際上是fl」 - 它確實是,但你的輸入是UTF-8而不是ASCII :-)。我猜你是從Word文檔或電子書粘貼的,或者是爲展示而設計的,而不是數據保真度(或者從內容來看,這是一個LaTeX生成的PDF?)。

如果你想處理這個特殊情況,你可以用ASCII字母「fl」替換那個字節序列。如果要處理所有此類個案,則必須使用Unicode聯合會的「UNIDATA」文件:http://www.unicode.org/Public/UNIDATA/UnicodeData.txt。在該文件中,有一列用於字符的「分解」。 f-l連字具有標識符「LATIN SMALL LIGATURE FL」。順便提一句,這個數據文件的Python模塊位於https://docs.python.org/2/library/unicodedata.html。您想要「分解」功能:

>>> import unicodedata 
>>> foo = u"fluphenazine" 
>>> unicodedata.decomposition(foo[0]) 
'<compat> 0066 006C' 

0066 006C當然是ASCII'f'和'l'。

請注意,如果您試圖將UTF-8數據轉換爲ASCII碼,那麼您最終會遇到糟糕的一天。只有127個ASCII字符,並且UTF-8具有數百萬個代碼點。 UTF-8中有許多代碼點不能以非卷積的方式很容易地表示爲ASCII - 誰想要一些文本最後說「<TREBLE CLEF> <SNOWMAN> <AIRPLANE> <YELLOW SMILEY FACE>」?