วิธีรับค่า ASCII ของอักขระ


คำตอบ:


1346

จากที่นี่ :

function ord () จะได้รับค่า int ของ char และในกรณีที่คุณต้องการแปลงกลับหลังจากเล่นกับตัวเลขฟังก์ชัน 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'

ในหลาม 3 คุณสามารถใช้แทนchrunichr


ord () - เอกสาร Python 3.6.5rc1

ord () - เอกสาร Python 2.7.14


ซึ่งการเข้ารหัสใน chr ใช้?
njzk2

15
โปรดทราบว่า chr ยังทำหน้าที่เหมือน unichr ใน Python 3 chr(31415) -> '窷'
William

6
@ njzk2: มันไม่ได้ใช้การเข้ารหัสตัวอักษรใด ๆ ก็จะส่งกลับ bytestring ในหลาม 2 chr(ord(u'й'.encode('cp1251'))).decode('cp1251') == u'й'มันเกินที่คุณจะตีความว่าเป็นเช่นตัวอักษร ใน Python 3 (หรือunichrใน Python 2) หมายเลขอินพุตจะถูกตีความเป็นลำดับเลขจำนวนเต็ม Unicode codepoint: unichr(0x439) == '\u0439'(จำนวนเต็ม 256 ตัวแรกมีการจับคู่แบบเดียวกับ latin-1 unichr(0xe9) == b'\xe9'.decode('latin-1'):, อันดับแรก 128 - ascii: unichr(0x0a) == b'\x0a'.decode('ascii')เป็นสิ่ง Unicode ไม่ใช่ งูใหญ่)
jfs

4
ทำไมฟังก์ชั่นที่เรียกว่า "อ๊อด"
eLymar

6
@ eLymar: มันสั้นสำหรับ "ลำดับ" ซึ่งมีรากภาษาที่คล้ายกันเพื่อ "สั่งซื้อ" - คือตัวเลขมากกว่าการเป็นตัวแทนสัญลักษณ์ของตัวละคร
Jacob Krall

166

โปรดทราบว่าord()ไม่ให้ค่า ASCII ต่อคุณ มันให้คุณค่ากับตัวเลขของตัวละครไม่ว่าจะเป็นการเข้ารหัสอะไรก็ตามดังนั้นผลลัพธ์ของมันord('ä')อาจเป็น 228 ถ้าคุณใช้ภาษาละติน -1 หรือเพิ่มขึ้นTypeErrorถ้าคุณใช้ UTF-8 มันยังสามารถส่งคืน codepoint Unicode แทนถ้าคุณผ่านมัน Unicode:

>>> ord(u'あ')
12354

15
คุณจะทราบได้อย่างไรว่าคุณกำลังใช้การเข้ารหัสแบบใดในสถานการณ์ที่กำหนด
หนวด

1
@Moustache: ใน Python3 คุณจะใช้ Unicode ไม่อยู่ในกล่อง
tricasse

ขึ้นอยู่กับชนิดของวัตถุ Python3 ( str ): unicodeโดยค่าเริ่มต้น Python3 ( ไบต์ ): str(b'\xc3\x9c', 'ascii')-> ยกUnicodeDecodeError Python3 ( ไบต์ ): str(b'\xc3\x9c', 'utf-8')-> ผลตอบแทนÜ คุณยังสามารถดูในหกแพ็กเกจ
nosahama


36

คำตอบที่ยอมรับนั้นถูกต้อง แต่มีวิธีที่ชาญฉลาด / มีประสิทธิภาพมากขึ้นในการทำเช่นนี้หากคุณต้องการแปลงอักขระ 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 มันเกี่ยวข้องเพียงเล็กน้อยเท่านั้นเพราะมันไม่มีbytesวัตถุสไตล์ Py3 ( 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 การทำซ้ำ a strเพื่อรับรหัส ASCII โดยใช้map(ord, mystr)เริ่มต้นปิดโดยใช้เวลาประมาณสองเท่านานกว่าlen10 strกว่าการใช้bytearray(mystr)บน Py2 หรือmystr.encode('ascii')บน Py3 และเมื่อstrได้รับนานขึ้นตัวคูณที่จ่ายให้map(ord, mystr)เพิ่มขึ้น ถึง ~ 6.5x-7x

ข้อเสียเพียงอย่างเดียวคือการแปลงทั้งหมดในครั้งเดียวดังนั้นผลลัพธ์แรกของคุณอาจใช้เวลานานกว่าเล็กน้อยและขนาดมหึมาอย่างแท้จริงstrจะมีขนาดใหญ่ชั่วคราวbytes/ bytearrayแต่ยกเว้นว่าสิ่งนี้บังคับให้คุณเข้าสู่การเฆี่ยนตีหน้า .


3

ในการรับรหัส 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]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.