Cách nhận giá trị ASCII của một ký tự


1036

Làm cách nào để tôi nhận được giá trị ASCII của một ký tự như inttrong Python ?

Câu trả lời:


1347

Từ đây :

Hàm ord () sẽ lấy giá trị int của char. Và trong trường hợp bạn muốn chuyển đổi trở lại sau khi chơi với số, hàm chr () thực hiện thủ thuật.

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

Trong Python 2, cũng có unichrhàm, trả về tự Unicode có thứ tự là unichrđối số:

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

Trong Python 3 bạn có thể sử dụng chrthay vì unichr.


ord () - Tài liệu Python 3.6.5rc1

ord () - Tài liệu Python 2.7,14


mã hóa nào trong chr sử dụng?
njzk2

15
Lưu ý rằng chr cũng hoạt động như unichr trong Python 3. chr(31415) -> '窷'
William

6
@ njzk2: nó không sử dụng bất kỳ mã hóa ký tự nào, nó trả về một bytestring trong Python 2. Tùy thuộc vào bạn để diễn giải nó như một ký tự, vd chr(ord(u'й'.encode('cp1251'))).decode('cp1251') == u'й'. Trong Python 3 (hoặc unichrtrong Python 2), số đầu vào được hiểu là thứ tự số nguyên mã Unicode: unichr(0x439) == '\u0439'(256 số nguyên đầu tiên có cùng ánh xạ với latin-1 : unichr(0xe9) == b'\xe9'.decode('latin-1'), 128 - ascii đầu tiên: unichr(0x0a) == b'\x0a'.decode('ascii')không phải là một thứ Unicode Con trăn).
jfs

4
Tại sao chức năng được gọi là "ord"?
eLymar

6
@eLymar: viết tắt của "ordinal", có nguồn gốc ngôn ngữ tương tự như "trật tự" - tức là đại diện số chứ không phải là biểu tượng của nhân vật
Jacob Krall

166

Lưu ý rằng ord()không cung cấp cho bạn giá trị ASCII mỗi se; nó cung cấp cho bạn giá trị số của ký tự trong bất kỳ mã hóa nào. Nó là kết quả ord('ä')có thể là 228 nếu bạn đang sử dụng Latin-1 hoặc nó có thể tăng TypeErrornếu bạn đang sử dụng UTF-8. Nó thậm chí có thể trả về mã điểm Unicode thay vào đó nếu bạn chuyển nó thành một unicode:

>>> ord(u'あ')
12354

15
Làm thế nào bạn có thể tìm ra mã hóa nào bạn đang sử dụng trong một tình huống nhất định?
ria mép

1
@Moustache: Trong Python3, bạn sẽ sử dụng tính năng Unicode ngoài luồng.
tricasse

Phụ thuộc vào loại đối tượng . Python3 ( str ): unicodetheo mặc định. Python3 ( byte ): str(b'\xc3\x9c', 'ascii')-> tăng UnicodeDecodeError . Python3 ( byte ): str(b'\xc3\x9c', 'utf-8')-> trả về Ü . Bạn cũng có thể nhìn vào gói sáu .
nosahama


36

Câu trả lời được chấp nhận là chính xác, nhưng có một cách thông minh / hiệu quả hơn để làm điều này nếu bạn cần chuyển đổi một loạt các ký tự ASCII thành mã ASCII của chúng cùng một lúc. Thay vì làm:

for ch in mystr:
    code = ord(ch)

hoặc nhanh hơn một chút:

for code in map(ord, mystr):

bạn chuyển đổi sang các loại bản địa Python lặp lại các mã trực tiếp. Trên Python 3, nó không quan trọng:

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

và trên Python 2.6 / 2.7, nó chỉ liên quan nhiều hơn một chút vì nó không có bytesđối tượng kiểu Py3 ( byteslà bí danh str, lặp lại theo ký tự), nhưng chúng có 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'):

Mã hóa như một kiểu lặp đi lặp lại theo quy tắc có nghĩa là việc chuyển đổi diễn ra nhanh hơn nhiều; trong các thử nghiệm cục bộ trên cả Py2.7 và Py3.5, việc lặp lại strđể lấy mã ASCII của nó bằng cách sử dụng map(ord, mystr)bắt đầu mất khoảng gấp đôi thời gian cho len10 strso với sử dụng bytearray(mystr)trên Py2 hoặc mystr.encode('ascii')trên Py3, và càng strlâu, số nhân càng được trả cho map(ord, mystr)tăng đến ~ 6,5x-7x.

Nhược điểm duy nhất là chuyển đổi tất cả cùng một lúc, do đó, kết quả đầu tiên của bạn có thể mất một chút thời gian và thực sự rất lớn strsẽ có một tỷ lệ tạm thời lớn tương đối bytes/ bytearray, nhưng trừ khi điều này buộc bạn phải đập trang, điều này không có vấn đề gì .


3

Để lấy mã ASCII của một ký tự, bạn có thể sử dụng ord()hàm.

Đây là một mã ví dụ:

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

Đầu ra:

Your value here: qwerty
[113, 119, 101, 114, 116, 121]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.