2010-06-27 84 views
3

我正在尋求標準化python中的一些unicode文本。我想知道是否有一種簡單的方法來獲取python中unicode字符的「非規範化」形式?例如如果我有序列u'o \ xaf'(即latin small letter o後跟combining macron),則獲得ō(latin small letter o with macron)。這很容易走另一條路:Python「denormalize」unicode組合字符

o = unicodedata.lookup("LATIN SMALL LETTER O WITH MACRON") 
o = unicodedata.normalize('NFD', o) 
+0

U + 00AF是不結合*長音符號一個*。那是U + 0304。 – kennytm 2010-06-27 09:21:50

+0

'\ xaf'不是組合macron,'\ u0304'是。 – 2010-06-27 09:22:22

+0

oops。當我寫下這個問題時,把數字混合起來:) – Puzzled79 2010-06-27 21:34:01

回答

4

正如我評論,U + 00AF是不是結合長音符號。但是你可以用NFKD變換將它轉換成U + 0020 U + 0304。

>>> unicodedata.normalize('NFKD', u'o\u00af') 
u'o \u0304' 

然後,您可以刪除空間,並獲得與NFCō。


(注意NFKD是一種方式,一些語義可以失去分解相當積極 - 什麼是「兼容」將被分離出來,如

  • '½'(U + 008D) ↦'1''⁄'(U + 2044)'2';
  • '²'(U + 00B2)↦'2'
  • '①'(U + 2460)↦'1'

等)

+0

工程就像一個魅力!謝謝 - 我試過NFKD,但我沒有想到再次正常化它。 – Puzzled79 2010-06-27 21:41:00

+0

考慮到這個問題的意思是指定爲輸入的字符串是'u'o \ u0304'',那麼首先不需要NFKD歸一化。在該字符串上執行NFC標準化就足以獲得'u'\ u014d''所需的結果。 – markshep 2016-10-03 15:21:11

+0

@markshep:請仔細閱讀OP的問題,輸入序列是'u'o \ xaf'',即「o¯」,** not **'u'o \ u0304''。你需要做NFKD把''\ xaf''轉換成''\ u0304''。 – kennytm 2016-10-03 16:44:46

3
o = unicodedata.normalize('NFC', o)