使用Python编码重音字符的问题

2 投票
2 回答
4514 浏览
提问于 2025-04-16 01:43

我在用Python命令行处理带重音符号的字符时遇到了问题。把我的问题简化一下,这段代码:

>>> import urllib
>>> print urllib.urlencode({'foo' : raw_input('> ')})
> áéíóúñ

在Mac的命令行中输出的是:

foo=%C3%A1%C3%A9%C3%AD%C3%B3%C3%BA%C3%B1

但是同样的代码在Windows的命令行中输出的是:

foo=%A0%82%A1%A2%A3%A4

在Mac上的结果是正确的,字符被正确编码了;但在Windows上我看到一堆乱码。

我猜问题可能出在Windows对字符的编码方式上,但我找不到解决办法;如果你能帮我,我会非常感激。提前谢谢你!

2 个回答

3

你可以使用明确的编码方式来获得一致的结果。

>>> str = u"áéíóúñ"
>>> import urllib
>>> urllib.urlencode({'foo':str.encode('utf-8')})
'foo=%C3%A1%C3%A9%C3%AD%C3%B3%C3%BA%C3%B1'

不过,你需要先确保你的字符串是以unicode格式存在的,如果不是的话,可能需要先进行解码,比如用raw_input().decode('latin1')或者raw_input().decode('utf-8')。

输入的编码方式可能跟你使用的控制台的地区设置有关,所以这跟系统是有关系的。

编辑:unicode(str)也应该使用地区编码来转换成unicode,这样可能也是一个解决办法。

2

在美国的Windows系统中,命令行使用的是cp437这种编码方式。但是你需要使用utf-8编码:

>>> import sys
>>> sys.stdin.encoding
'cp437'
>>> print urllib.urlencode({'foo':raw_input('> ').decode('cp437').encode('utf8')})
> áéíóúñ
foo=%C3%A1%C3%A9%C3%AD%C3%B3%C3%BA%C3%B1

撰写回答