解析\xd0\xb2\xd0\xbe等问题
我正在从数据库中读取一些数据,这些数据有多种语言,其中一种是俄语。当我尝试读取文本时,字符串显示如下:
('\xd0\xb2\xd0\xbe\xd1\x82 \xd0\xb2\xd1\x8b \xd0\xb5\xd0\xb3\xd0\xbe \xd1\x81\xd0\xb5\xd0\xb9\xd1\x87\xd0\xb0\xd1\x81 \xd0\xb8 \xd0\xbe\xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb4\xd1\x8b\xd0\xb2\xd0\xb0\xd0\xb5\xd1\x82\xd0\xb5! \xd0\xa0\xd0\xb0\xd1\x88\xd0\xb8\xd1\x81\xd1\x82\xd1\x8b \xd0\xb5\xd1\x89\xd1\x91 \xd1\x81\xd0\xb5\xd0\xb1\xd1\x8f \xd0\xbf\xd1\x80\xd0\xbe\xd1\x8f\xd0\xb2\xd1\x8f\xd1\x82. \xd1\x8d\xd1\x82\xd0\xbe \xd0\xb5\xd1\x89\xd1\x91 \xd0\xb4\xd0\xb0\xd0\xb6\xd0\xb5 \xd0\xbd\xd0\xb5 \xd0\xbd\xd0\xb0\xd1\x87\xd0\xb0\xd0\xbb\xd0\xbe!',)
所以如果我现在把我的代码写成:
import pprint
class MyPrettyPrinter(pprint.PrettyPrinter):
def format(self, object, context, maxlevels, level):
if isinstance(object, unicode):
return (object.encode('utf8'), True, False)
return pprint.PrettyPrinter.format(self, object, context, maxlevels, level)
a = ('\xd0\xb2\xd0\xbe\xd1\x82 \xd0\xb2\xd1\x8b \xd0\xb5\xd0\xb3\xd0\xbe \xd1\x81\xd0\xb5\xd0\xb9\xd1\x87\xd0\xb0\xd1\x81 \xd0\xb8 \xd0\xbe\xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb4\xd1\x8b\xd0\xb2\xd0\xb0\xd0\xb5\xd1\x82\xd0\xb5! \xd0\xa0\xd0\xb0\xd1\x88\xd0\xb8\xd1\x81\xd1\x82\xd1\x8b \xd0\xb5\xd1\x89\xd1\x91 \xd1\x81\xd0\xb5\xd0\xb1\xd1\x8f \xd0\xbf\xd1\x80\xd0\xbe\xd1\x8f\xd0\xb2\xd1\x8f\xd1\x82. \xd1\x8d\xd1\x82\xd0\xbe \xd0\xb5\xd1\x89\xd1\x91 \xd0\xb4\xd0\xb0\xd0\xb6\xd0\xb5 \xd0\xbd\xd0\xb5 \xd0\xbd\xd0\xb0\xd1\x87\xd0\xb0\xd0\xbb\xd0\xbe!',)
MyPrettyPrinter().pprint(a)
输出结果是:
('\xd0\xb2\xd0\xbe\xd1\x82 \xd0\xb2\xd1\x8b \xd0\xb5\xd0\xb3\xd0\xbe \xd1\x81\xd0\xb5\xd0\xb9\xd1\x87\xd0\xb0\xd1\x81 \xd0\xb8 \xd0\xbe\xd0\xbf\xd1\x80\xd0\xb0\xd0\xb2\xd0\xb4\xd1\x8b\xd0\xb2\xd0\xb0\xd0\xb5\xd1\x82\xd0\xb5! \xd0\xa0\xd0\xb0\xd1\x88\xd0\xb8\xd1\x81\xd1\x82\xd1\x8b \xd0\xb5\xd1\x89\xd1\x91 \xd1\x81\xd0\xb5\xd0\xb1\xd1\x8f \xd0\xbf\xd1\x80\xd0\xbe\xd1\x8f\xd0\xb2\xd1\x8f\xd1\x82. \xd1\x8d\xd1\x82\xd0\xbe \xd0\xb5\xd1\x89\xd1\x91 \xd0\xb4\xd0\xb0\xd0\xb6\xd0\xb5 \xd0\xbd\xd0\xb5 \xd0\xbd\xd0\xb0\xd1\x87\xd0\xb0\xd0\xbb\xd0\xbe!',)
我想把这个文本转换回ASCII格式。我试过了PrettyPrinter
方法,具体说明可以在这里找到,但这个方法只是打印了字符串。我想把这个“修复过的”字符串以ASCII/utf-8格式(也就是实际的俄文文本,而不是带有斜杠的文本)捕获并存储到一个列表中,但我不知道该怎么做。希望能得到一些帮助。
编辑:
这是我拥有的字符串,我尝试将其转换为unicode,但完全没有效果。
1 个回答
1
如果你打印一个像元组这样的容器对象,它里面的每个元素都会被转换成它的 repr()
字符串形式。对于那些不在可显示的ASCII字符范围内的字节值,它会用十六进制转义表示。这样做的目的是让程序员能看到这些值实际包含了什么,而不必担心终端会根据某种编码来解释它们。假设终端不会对ASCII字符做什么特殊处理。
print a[0]
# -> вот вы его сейчас и оправдываете! Рашисты ещё себя проявят. это ещё даже не начало!
所以,如果你的终端使用的是UTF-8编码,那你只需要把元组里的值取出来打印就可以了。否则,你可能需要先用UTF-8对字符串进行 解码,把它转换成一个 unicode
对象,然后再进行后续处理。