/ / Python a unicode kódové extrakcie - python, unicode

Python a unicode kódové extrakcie - python, unicode

V Python API, je tu spôsob, ako extrahovať unicode bod kódu jedného znaku?

edit: V prípade, že je to dôležité, používam Python 2.7.

odpovede:

27 pre odpoveď č. 1
>>> ord(u"ć")
263
>>> u"café"[2]
u"f"
>>> u"café"[3]
u"xe9"
>>> for c in u"café":
...     print repr(c), ord(c)
...
u"c" 99
u"a" 97
u"f" 102
u"xe9" 233

33 pre odpoveď č. 2

Ak správne rozumiem vašej otázke, môžete to urobiť.

>>> s="㈲"
>>> s.encode("unicode_escape")
b"\u3232"

Zobrazuje unikódový kód unicode ako zdrojový reťazec.


7 pre odpoveď č. 3

Obvykle to jednoducho robíte ord(character) nájsť kódový bod znaku. Pre úplnosť sú však široké znaky v dodatočnej viacjazyčnej rovine Unicode reprezentované ako náhradné páry (t. J. Dve kódové jednotky) v úzkych Python staviacich, takže v takom prípade som často potreboval urobiť túto malú prácu okolo:

def get_wide_ordinal(char):
if len(char) != 2:
return ord(char)
return 0x10000 + (ord(char[0]) - 0xD800) * 0x400 + (ord(char[1]) - 0xDC00)

To je však zriedkavé vo väčšine aplikácií, a preto sa zvyčajne používa ord().


3 pre odpoveď č. 4

Ukázalo sa, že dostať to správne je pomerne zložité: Python 2 a Python 3 majú nejaké jemné problémy s extrahovaním kódovacích bodov Unicode z reťazca.

Až do služby Python 3.3 bolo možné zostaviť program Python v jednom z dvoch režimov:

  1. sys.maxunicode == 0x10FFFF

V tomto režime reťazce Pythonu Unicode podporujú celý rozsah kódovacích bodov Unicode od U + 0000 do U + 10FFFF Jeden kódový bod predstavuje jeden prvok reťazca:

>>> import sys
>>> hex(sys.maxunicode)
"0x10ffff"
>>> len(u"U0001F40D")
1
>>> [c for c in u"U0001F40D"]
[u"U0001f40d"]

Toto je predvolené nastavenie pre Python 2.7 v systéme Linux, rovnako ako univerzálne na Pythone 3.3 a neskôr vo všetkých operačných systémoch.

  1. sys.maxunicode == 0xFFFF

V tomto režime sa používajú iba reťazce Pythonu Unicodepodporovať rozsah kódových bodov Unicode od U + 0000 po U + FFFF. Akýkoľvek kód bodov od U + 10000 až U + 10FFFF je reprezentovaný použitím pár reťazcov v kódovaní UTF-16 ::

>>> import sys
>>> hex(sys.maxunicode)
"0xffff"
>>> len(u"U0001F40D")
2
>>> [c for c in u"U0001F40D"]
[u"ud83d", u"udc0d"]

Toto je predvolené nastavenie programu Python 2.7 v systéme MacOS a Windows.

Tento rozdiel v režime spustenia spôsobuje, že písanie modulov Pythonu na manipuláciu s reťazcami Unicode ako sériu kódových bodov je celkom nepríjemné.

Na vyriešenie tohto problému som prispel novým modulom codepoints na PyPI:

https://pypi.python.org/pypi/codepoints/1.0

Tento modul rieši problém tým, že vystavuje rozhrania API na konverziu reťazcov Unicode do a zo zoznamov kódových bodov bez ohľadu na základné nastavenie pre sys.maxunicode::

>>> hex(sys.maxunicode)
"0xffff"
>>> snake = tuple(codepoints.from_unicode(u"U0001F40D"))
>>> len(snake)
1
>>> snake[0]
128013
>> hex(snake[0])
"0x1f40d"
>>> codepoints.to_unicode(snake)
u"U0001f40d"