RPython中的ord()与非ASCII字符
我正在用RPython和PyPy制作一个虚拟机。我的问题是,我把每个字符转换成数字表示。比如,把字母“a”转换后得到97。然后我把97转换成十六进制,就得到了0x61。
举个例子,我想把字母“á”转换成十六进制表示,应该是0xe1,但我得到的是0xc3 0xa1。
我需要使用特定的编码吗?目前我使用的是UTF-8。
--更新--
这里的instr是"á"
(包括引号)
for char in instr:
char = str(int(ord(char)))
char = hex(int(char))
char = char[2:]
print char # Prints 22 C3 A1 22, 22 is each of the quotes
# The desired output is 22 E1 22
2 个回答
0
你正在使用Python语言的第2个版本,因此你的字符串:"á"
是一个字节字符串,它的内容取决于你源文件的编码方式。如果编码是UTF-8,那么它的内容就是C3 A1
- 这个字符串包含两个字节。
如果你想把它转换成Unicode字符(也叫代码点),或者转换成UTF-16代码点(这取决于你的Python安装),你需要先把它转换成unicode
,比如可以使用.decode('utf-8')
。
# -*- encoding: utf-8 -*-
def stuff(instr):
for char in instr:
char = str(int(ord(char)))
char = hex(int(char))
# I'd replace those two lines above with char = hex(ord(char))
char = char[2:]
print char
stuff("á")
print("-------")
stuff(u"á")
输出结果:
c3
a1
-------
e1
0
#!/usr/bin/env python
# -*- coding: latin-1 -*-
char = 'á'
print str(int(ord(char)))
print hex(int(char))
print char.decode('latin-1')
给我的是:
225
0xe1
0xe1