2008-10-22 208 views

回答

950

here

功能ORD()会得到字符的int值 。如果你想在 号码后面 转换回来,函数chr(​​)可以做到这一点。

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

在Python 2,还有的unichr功能,返回Unicode字符的次序是unichr说法:

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

在Python 3,你可以使用chr而不是unichr

+0

哪个编码在chr中使用? – njzk2 2011-12-14 08:59:31

+0

@ njzk2:`latin1`(如果你的原始字节是用cp1251编码的(例如cp1251)(西里尔语) – 2012-04-17 04:57:56

38

您正在寻找:

ord() 
134

请注意,ord()本身不给你ASCII值;它会为您提供字符的数字值,因为它使用的是任何编码。因此,如果您使用Latin-1,则ord('ä')的结果可能为228,或者如果您使用UTF- 8。它甚至可以返回的Unicode码点,而不是如果你传递一个Unicode:

>>> ord(u'あ') 
12354 
12

接受的答案是正确的,但有一个更聪明的/有效的方法,如果你需要一大堆ASCII的转换要做到这一点字符一次写入他们的ASCII码。而不是做:

for ch in mystr: 
    code = ord(ch) 

或稍快:

​​

你转换成直接迭代代码的Python原生类型。在Python 3中,这是微不足道的:

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

和Python的2.6/2.7,因为它没有一个PY3风格bytes对象时,它只是稍微有点复杂(bytesstr一个别名,它通过文字迭代) ,但他们确实有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上的本地测试中,重复使用str以获得其ASCII码使用map(ord, mystr)开始需要的时间约为Py3上的bytearray(mystr)或Py3上的mystr.encode('ascii')上的,并且当str获得时更长的时候,支付给map(ord, mystr)的乘数上涨至〜6.5x-7x。

唯一的缺点是,转换是一下子,让你的第一个结果可能需要较长的时间,而一个真正的巨大str将有一个比例较大的临时bytes/bytearray,但除非这迫使你进入页抖动,这可能不重要。