2008-10-22 14 views

Odpowiedz

950

Od here:

funkcji ord() by uzyskać wartość int o char. A jeśli chcesz, aby konwertować ponownie po graniu z numerem , funkcja chr() wykonuje lewę.

>>> ord('a') 
97 
>>> chr(97) 
'a' 
>>> chr(ord('a') + 3) 
'd' 
>>> 

W Pythonie 2, istnieje również funkcja unichr, wracając charakter Unicode którego porządkowa jest unichr argumentem:

>>> unichr(97) 
u'a' 
>>> unichr(1234) 
u'\u04d2' 

W Pythonie 3 można użyć chr zamiast unichr.

+0

które kodowanie w chr przy użyciu? – njzk2

+0

@ njzk2: 'latin1' (co nie jest genialne, jeśli twój oryginalny bajt został zakodowany w (powiedzmy)' cp1251' (cyrylica) –

+13

Zauważ, że chr działa również jako unichr w Pythonie 3. 'chr (31415) -> '窷' ' – William

38

Szukasz:

ord() 
134

Należy zauważyć, że ord() nie daje wartości ASCII jako takiej; daje wartość liczbową znaku w dowolnym kodowaniu. Dlatego wynik ord ("ä") może wynosić 228, jeśli używasz Latin-1, lub możesz wywołać TypeError, jeśli używasz UTF-a 8. Może nawet zwrócić kodowy Unicode zamiast jeśli przejdą mu unicode:

>>> ord(u'あ') 
12354 
+6

Jak możesz dowiedzieć się, jakiego kodowania używasz w danej sytuacji? – Moustache

12

Zaakceptowanych odpowiedź jest poprawna, ale jest bardziej mądry/skuteczny sposób to zrobić, jeśli chcesz przekonwertować całą masę ASCII znaki do ich kodów ASCII na raz. Zamiast robić:

for ch in mystr: 
    code = ord(ch) 

albo nieco szybciej:

for code in map(ord, mystr): 

przekonwertować do Pythona rodzimych typów, które iteracyjne kody bezpośrednio. Na Python 3, jest banalna:

for code in mystr.encode('ascii'): 

i na Pythonie 2.6/2.7, to tylko nieco bardziej zaangażowane, ponieważ nie posiada Py3 stylu bytes obiektu (bytes jest aliasem dla str, który dokonuje iteracji po znaku) , ale mają bytearray:

# If mystr is definitely str, not unicode 
for code in bytearray(mystr): 

# If mystr could be either str or unicode 
for code in bytearray(mystr, 'ascii'): 

Kodowanie jako typ, który natywnie iteracje przez porządkowej oznacza przekształcenie idzie znacznie szybciej; w testach lokalnych na Py2.7 i Py3.5, iteracja str w celu uzyskania kodów ASCII z użyciem map(ord, mystr) rozpoczyna się od około dwukrotnego wydłużenia dla niż przy użyciu bytearray(mystr) na Py2 lub mystr.encode('ascii') na Py3 i jako str dłużej, mnożnik zapłacony za map(ord, mystr) wzrasta do ~ 6,5x-7x.

Jedynym minusem jest to, że konwersja jest wszystko na raz, dzięki czemu pierwszy wynik może trwać nieco dłużej, a to naprawdę ogromny str miałaby proporcjonalnie duży tymczasowy bytes/bytearray, ale chyba to zmusza cię do widoku bicia, to nie ma znaczenia.