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:
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.
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"