Câu trả lời:
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ó unichr
hàm, trả về ký 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 chr
thay vì unichr
.
chr(31415) -> '窷'
chr(ord(u'й'.encode('cp1251'))).decode('cp1251') == u'й'
. Trong Python 3 (hoặc unichr
trong 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).
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 TypeError
nế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
Bạn đang tìm kiếm:
ord()
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 ( bytes
là 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 len
10 str
so với sử dụng bytearray(mystr)
trên Py2 hoặc mystr.encode('ascii')
trên Py3, và càng str
lâ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 str
sẽ 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ì .