Odpowiedzi:
Od tutaj :
funkcja ord () otrzyma wartość int znaku char. A jeśli chcesz ponownie przekonwertować po odtworzeniu numeru, funkcja chr () załatwi sprawę.
>>> ord('a')
97
>>> chr(97)
'a'
>>> chr(ord('a') + 3)
'd'
>>>
W Pythonie 2 jest także unichr
funkcja zwracająca znak Unicode, którego unichr
argumentem porządkowym jest :
>>> unichr(97)
u'a'
>>> unichr(1234)
u'\u04d2'
W Pythonie 3 możesz użyć chr
zamiast unichr
.
chr(31415) -> '窷'
chr(ord(u'й'.encode('cp1251'))).decode('cp1251') == u'й'
. W Pythonie 3 (lub unichr
w Pythonie 2) numer wejściowy jest interpretowany jako liczba całkowita w kodzie Unicode: unichr(0x439) == '\u0439'
(pierwsze 256 liczb całkowitych ma takie samo odwzorowanie jak latin-1: unichr(0xe9) == b'\xe9'.decode('latin-1')
pierwsze 128 - ascii: unichr(0x0a) == b'\x0a'.decode('ascii')
jest to kwestia Unicode, a nie Pyton).
Zauważ, że ord()
nie daje ci wartości ASCII per se; daje ci wartość liczbową znaku w dowolnym kodowaniu. Dlatego wynik ord('ä')
może wynosić 228, jeśli używasz Latin-1, lub może podnieść a, TypeError
jeśli używasz UTF-8. Może nawet zwrócić kod kodowy Unicode, jeśli podasz mu kod Unicode:
>>> ord(u'あ')
12354
Szukasz:
ord()
Przyjęta odpowiedź jest poprawna, ale istnieje bardziej sprytny / wydajny sposób, aby to zrobić, jeśli chcesz przekonwertować całą masę znaków ASCII na ich kody ASCII. Zamiast robić:
for ch in mystr:
code = ord(ch)
lub nieco szybciej:
for code in map(ord, mystr):
konwertujesz na rodzime typy Python, które bezpośrednio iterują kody. W Pythonie 3 jest to banalne:
for code in mystr.encode('ascii'):
a w Pythonie 2.6 / 2.7 jest tylko nieco bardziej zaangażowany, ponieważ nie ma bytes
obiektu w stylu Py3 ( bytes
jest to alias str
, który iteruje się 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 iteruje porządkowo, oznacza, że konwersja przebiega znacznie szybciej; w lokalnych testach zarówno na Py2.7, jak i Py3.5, iteracja a w str
celu uzyskania kodów ASCII przy użyciu map(ord, mystr)
zaczyna się od około dwa razy dłużej dla len
10 str
niż przy użyciu bytearray(mystr)
Py2 lub mystr.encode('ascii')
Py3, a wraz z str
wydłużaniem się mnożnik płaci za map(ord, mystr)
podwyżki do ~ 6,5x-7x.
Jedynym minusem jest to, że konwersja odbywa się naraz, więc twój pierwszy wynik może potrwać nieco dłużej, a naprawdę ogromny str
będzie miał proporcjonalnie duży tymczasowy bytes
/ bytearray
, ale jeśli nie zmusi cię to do przerzucenia strony, nie ma to większego znaczenia .