Respostas:
A partir daqui :
A função ord () obteria o valor int do char. E caso você queira converter novamente depois de jogar com o número, a função chr () faz o truque.
>>> ord('a')
97
>>> chr(97)
'a'
>>> chr(ord('a') + 3)
'd'
>>>
No Python 2, há também a unichr
função, retornando o caractere Unicode cujo ordinal é o unichr
argumento:
>>> unichr(97)
u'a'
>>> unichr(1234)
u'\u04d2'
No Python 3 você pode usar em chr
vez de unichr
.
chr(31415) -> '窷'
chr(ord(u'й'.encode('cp1251'))).decode('cp1251') == u'й'
,. No Python 3 (ou unichr
no Python 2), o número de entrada é interpretado como ordinal inteiro do ponto de código Unicode: unichr(0x439) == '\u0439'
(os primeiros 256 números inteiros têm o mesmo mapeamento que latin-1 unichr(0xe9) == b'\xe9'.decode('latin-1')
:, os primeiros 128 - ascii: unichr(0x0a) == b'\x0a'.decode('ascii')
é uma coisa Unicode, não Pitão).
Observe que ord()
não fornece o valor ASCII em si; fornece o valor numérico do caractere em qualquer codificação em que esteja. Portanto, o resultado de ord('ä')
pode ser 228 se você estiver usando o Latin-1 ou pode aumentar um TypeError
se estiver usando o UTF-8. Pode até retornar o ponto de código Unicode, se você passar um unicode:
>>> ord(u'あ')
12354
unicode
por padrão. Python3 ( bytes ): str(b'\xc3\x9c', 'ascii')
-> gera UnicodeDecodeError . Python3 ( bytes ): str(b'\xc3\x9c', 'utf-8')
-> retorna Ü . Você também pode olhar para o pacote de seis .
Você está procurando:
ord()
A resposta aceita está correta, mas há uma maneira mais inteligente / eficiente de fazer isso se você precisar converter um monte de caracteres ASCII em seus códigos ASCII de uma só vez. Em vez de fazer:
for ch in mystr:
code = ord(ch)
ou um pouco mais rápido:
for code in map(ord, mystr):
você converte em tipos nativos do Python que iteram os códigos diretamente. No Python 3, é trivial:
for code in mystr.encode('ascii'):
e no Python 2.6 / 2.7, é apenas um pouco mais envolvido porque não possui um bytes
objeto de estilo Py3 ( bytes
é um alias para str
, que itera por caractere), mas eles têm 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'):
Codificar como um tipo que itera nativamente por ordinal significa que a conversão é muito mais rápida; em testes locais tanto no Py2.7 quanto no Py3.5, a iteração de str
para obter seus códigos ASCII map(ord, mystr)
começa demorando cerca de duas vezes mais para um len
10 do str
que bytearray(mystr)
no Py2 ou mystr.encode('ascii')
no Py3 e, à medida que str
aumenta, o multiplicador pago map(ord, mystr)
aumenta para ~ 6,5x-7x.
A única desvantagem é que a conversão é toda de uma só vez; portanto, seu primeiro resultado pode demorar um pouco mais, e um enorme enorme str
terá um temporário proporcionalmente grande bytes
/ bytearray
, mas, a menos que isso o force a se debater na página, é provável que isso não importe. .