如何获取字符的ASCII值

1307
如何在Python中将字符的ASCII值作为int获取?
6个回答

1724

这里开始:

ord()函数可以获取字符的整数值。如果你在操作完数字后想要转换回字符,可以使用chr()函数。

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

在 Python 2 中,还有一个 unichr 函数,返回其参数为 Unicode 序数的字符:

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

在Python 3中,您可以使用chr代替unichr

ord() - Python 3.6.5rc1 文档

ord() - Python 2.7.14 文档


chr 函数使用哪种编码? - njzk2
@njzk2:如果您的原始字节是以(比如)cp1251(西里尔文)编码的,则使用latin1并不是一个明智的选择。 - John Machin
23
请注意,chr在Python 3中也兼作unichr使用。 chr(31415) -> '窷' - William
7
在Python 2中,它不使用任何字符编码,而是返回一个字节字符串。你需要自己将其解释为字符,例如:chr(ord(u'й'.encode('cp1251'))).decode('cp1251') == u'й'。在Python 3中(或者Python 2中的unichr函数),输入的数字被解释为Unicode代码点整数序列:unichr(0x439) == '\u0439'(前256个整数与Latin-1具有相同的映射:unichr(0xe9) == b'\xe9'.decode('latin-1'),前128个则与ASCII相同:unichr(0x0a) == b'\x0a'.decode('ascii')这是一个Unicode的特性,而不是Python的。 - jfs
6
为什么这个函数被称为“ord”? - eLymar
11
@eLymar说的是"ordinal"的缩写,它与"order"有类似的语言根源——即该字符的数字表示,而非象征表示。 - Jacob Krall

188

请注意 ord() 并不是直接给你 ASCII 值;它会给出字符在任何编码下的数值。因此,ord('ä') 的结果在使用 Latin-1 编码时可能为 228,或者在使用 UTF-8 编码时可能引发一个 TypeError 异常。甚至如果你传递一个 Unicode 字符,它也可能返回 Unicode 码点。

>>> ord(u'あ')
12354

17
在特定情况下,如何确定你正在使用哪种编码方式? - Moustache
3
在Python3中,您将直接使用Unicode。 - tricasse
2
取决于对象类型。Python3 (str): 默认为unicode。Python3 (bytes):str(b'\xc3\x9c', 'ascii') -> 报错 _UnicodeDecodeError_。 Python3 (bytes): str(b'\xc3\x9c', 'utf-8') -> 返回 _Ü_。您还可以查看six包。 - nosahama

65

您正在寻找:

ord()

46

这个被接受的答案是正确的,但如果你需要一次性转换大量的ASCII字符为它们的ASCII码,有一种更巧妙/高效的方法。不要像下面这样做:

for ch in mystr:
    code = ord(ch)

或稍微快一点:

for code in map(ord, mystr):

你可以将其转换为Python本地类型,直接迭代代码。在Python 3上,这很简单:

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

在Python 2.6/2.7上,稍微有些不同,因为它没有Py3风格的bytes对象(bytes是一个别名,迭代方式是按字符迭代的str),但它们有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'):

将编码作为一种本质上按序号迭代的类型,意味着转换速度会更快;在Py2.7和Py3.5的本地测试中,使用map(ord, mystr)以获取str的ASCII码开始时,对于长度为10的str,所花费的时间大约是使用Py2上的bytearray(mystr)或Py3上的mystr.encode('ascii')的两倍,随着str变得更长,为map(ord, mystr)所支付的乘数上升到约为6.5x-7x。

唯一的缺点是转换是一次性进行的,因此您的第一个结果可能需要更长的时间,并且真正巨大的str会有一个相应较大的临时bytes/bytearray,但除非这会迫使您进入页面抖动状态,否则这不太可能成为问题。


7

要获取字符的ASCII码,可以使用ord()函数。

以下是示例代码:

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

输出:

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

0
Numpy也可以用来获取字符的ASCII值。如果你需要将许多字符转换为它们的ASCII/Unicode码点,这将非常有用。根据字符的数量,它可能比在循环中调用ord快上几个数量级。
要使用它,将字符串/字符包装在一个numpy数组中,并将其视为int,这将返回字符所在编码的相应数值。
import numpy as np

# if the characters are in a list
lst = ['a', 'ä', 'あ']
ary = np.array(lst).view(int).tolist()   # [97, 228, 12354]


# if the characters are in a string
s = 'abc'
ar = np.array([s])
v = s_arr.view(int)                      # array([97, 98, 99])

作为一个附带说明:视图的一个特点是,如果你改变了视图,原始视图也会随之改变。例如,如果我们想要将ar中的所有字符转换为大写,我们可以通过操作v来实现。
v -= 32
print(ar)   # ['ABC']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接