Como obter o valor ASCII de um personagem

1038

Como obtenho o valor ASCII de um caractere como intem Python ?

Matt
fonte

Respostas:

1349

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 unichrfunção, retornando o caractere Unicode cujo ordinal é o unichrargumento:

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

No Python 3 você pode usar em chrvez de unichr.


ord () - documentação do Python 3.6.5rc1

ord () - documentação do Python 2.7.14

Matt J
fonte
qual codificação em chr usando?
Njzk2
15
Note-se que chr também atua como unichr em Python 3. chr(31415) -> '窷'
William
6
@ njzk2: ele não usa codificação de caracteres, retorna uma bytestring no Python 2. Cabe a você interpretá-lo como um caractere, por exemplo chr(ord(u'й'.encode('cp1251'))).decode('cp1251') == u'й',. No Python 3 (ou unichrno 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).
JFS
4
Por que a função é chamada "ord"?
Elymar
6
@eLymar: é a abreviação de "ordinal", que tem raízes linguísticas semelhantes a "order" - ou seja, a representação numérica, e não simbólica, do personagem
Jacob Krall
167

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 TypeErrorse estiver usando o UTF-8. Pode até retornar o ponto de código Unicode, se você passar um unicode:

>>> ord(u'あ')
12354
Ignacio Vazquez-Abrams
fonte
15
Como você pode descobrir qual codificação você está usando em uma determinada situação?
Bigode
1
@ Bigode: No Python3, você usará Unicode pronto para uso.
tricasse 1/10/19
Depende do tipo de objeto . Python3 ( str ): unicodepor 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 .
nosahama 23/04
49

Você está procurando:

ord()
Jacob Krall
fonte
37

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 bytesobjeto 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 strpara obter seus códigos ASCII map(ord, mystr)começa demorando cerca de duas vezes mais para um len10 do strque bytearray(mystr)no Py2 ou mystr.encode('ascii')no Py3 e, à medida que straumenta, 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 strterá 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. .

ShadowRanger
fonte
3

Para obter o código ASCII de um caractere, você pode usar o ord() função

Aqui está um código de exemplo:

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

Resultado:

Your value here: qwerty
[113, 119, 101, 114, 116, 121]
Upz
fonte