RPython中的ord()与非ASCII字符

0 投票
2 回答
741 浏览
提问于 2025-04-18 04:06

我正在用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

撰写回答