Jak uzyskać wartość ASCII znaku

Odpowiedzi:

1346

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 unichrfunkcja zwracająca znak Unicode, którego unichrargumentem porządkowym jest :

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

W Pythonie 3 możesz użyć chrzamiast unichr.


ord () - dokumentacja Python 3.6.5rc1

ord () - dokumentacja Python 2.7.14

Matt J
źródło
które kodowanie w chr używa?
njzk2
15
Zauważ, że chr działa również jako unichr w Pythonie 3. chr(31415) -> '窷'
William
6
@ njzk2: nie używa żadnego kodowania znaków, zwraca bajtowanie w Pythonie 2. Od Ciebie zależy interpretowanie go jako znaku, np chr(ord(u'й'.encode('cp1251'))).decode('cp1251') == u'й'. W Pythonie 3 (lub unichrw 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).
jfs
4
Dlaczego funkcja nazywa się „ord”?
eLymar
6
@eLymar: skrót od „porządkowy”, który ma podobne korzenie językowe jak „porządek” - tj. numeryczna, a nie symboliczna reprezentacja postaci
Jacob Krall
166

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, TypeErrorjeśli używasz UTF-8. Może nawet zwrócić kod kodowy Unicode, jeśli podasz mu kod Unicode:

>>> ord(u'あ')
12354
Ignacio Vazquez-Abrams
źródło
15
Jak dowiedzieć się, jakiego kodowania używasz w danej sytuacji?
Wąsy
1
@Moustache: W Python3 będziesz używać Unicode od razu po wyjęciu z pudełka.
tricasse
Zależy od typu obiektu . Python3 ( str ): unicodedomyślnie. Python3 ( bajty ): str(b'\xc3\x9c', 'ascii')-> podnosi UnicodeDecodeError . Python3 ( bajty ): str(b'\xc3\x9c', 'utf-8')-> zwraca Ü . Możesz także zajrzeć do pakietu sześciu .
nosahama
36

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 bytesobiektu w stylu Py3 ( bytesjest 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 strcelu uzyskania kodów ASCII przy użyciu map(ord, mystr)zaczyna się od około dwa razy dłużej dla len10 strniż przy użyciu bytearray(mystr)Py2 lub mystr.encode('ascii')Py3, a wraz z strwydł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 strbędzie miał proporcjonalnie duży tymczasowy bytes/ bytearray, ale jeśli nie zmusi cię to do przerzucenia strony, nie ma to większego znaczenia .

ShadowRanger
źródło
3

Aby uzyskać kod ASCII znaku, możesz użyć ord()funkcji.

Oto przykładowy kod:

value = input("Your value here: ")
list=[ord(ch) for ch in value]
print(list)

Wynik:

Your value here: qwerty
[113, 119, 101, 114, 116, 121]
Upz
źródło