我正在尝试制作一个随机的维基页面生成器,询问用户是否要访问随机的维基页面。但是,其中一些页面具有重音字符,我想在运行代码时以 git bash 显示它们。我正在使用cmd模块来允许用户输入。现在,我显示标题的方式正在使用
r_site = requests.get("http://en.wikipedia.org/w/api.php?action=query&list=random&rnnamespace=0&rnlimit=10&format=json")
print(json.loads(r_site.text)["query"]["random"][0]["title"].encode("utf-8"))
有时它可以工作,但每当出现重音字符时,它就会显示为 25\xe2\x80\x9399。
有什么解决方法或替代方案吗?谢谢。
import sys
将编码更改为.encode(sys.stdout.encoding, errors="some string")
其中"某些字符串"可以是以下之一:
- "strict"(默认值)- 遇到不可打印的字符时引发 UnicodeError
- "忽略" - 不打印不可编码的字符
- "替换" - 将不可编码的字符替换为 ?
- "XMLCHARREFREPLACE" - 将不可编码的字符替换为 XML 转义序列
- "反斜杠替换" - 将不可编码的字符替换为转义的 Unicode 码位值
所以不,如果你的终端的区域设置不支持它,就没有办法让字符显示出来。但是这些选项允许您选择要执行的操作。
查看此处以获取更多参考。
我假设这是Python 3.x,因为你正在编写3.x风格的print
函数调用。
在 Python 3.x 中,print
任何对象调用str
该对象,然后将其编码为sys.stdout.encoding
以进行打印。
所以,如果你给它传递一个Unicode字符串,它就可以工作了(假设你的终端可以处理Unicode,并且Python已经正确猜对了sys.stdout.encoding
):
>>> print('abcé')
abcé
但是如果你给它传递一个bytes
对象,就像你从调用.encode('utf-8')
中得到的那个对象一样,str
函数的格式如下:
>>> print('abcé'.encode('utf-8'))
b'abcxcexa9'
为什么?因为bytes
对象不是字符串,这就是bytes
对象的打印方式 — 每个不可打印的 ASCII 字节的b
前缀、引号和反斜杠转义。
解决方案就是不打电话给encode('utf-8')
.
最有可能的是,你阅读了一些 Python 2.x 的代码,其中 bytes
和 str
是相同的类型,print
实际想要的类型,并尝试在 Python 3.x 中使用它。