Python中的字符编码
我有一串字节流,看起来像这样 '\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
str_data = '\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
str_data 是用下面的代码写入文本文件的
file = open("test_doc","w")
file.write(str_data)
file.close()
如果在网页浏览器中打开 test_doc,并把字符编码设置为日文,它就能正常显示。
我正在使用 reportlab 来生成 PDF,使用的代码如下
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfgen.canvas import Canvas
from reportlab.pdfbase.cidfonts import CIDFont
pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','90ms-RKSJ-H'))
pdfmetrics.registerFont(CIDFont('HeiseiKakuGo-W5','90ms-RKSJ-H'))
c = Canvas('test1.pdf')
c.setFont('HeiseiMin-W3-90ms-RKSJ-H', 6)
message1 = '\202\261\202\352\202\315\225\275\220\254\226\276\222\251\202\305\202\267\201B'
message3 = '\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88';
c.drawString(100, 675,message1)
c.save()
这里我用 message1 变量,它输出的是日文,但我需要用 message3 来生成 PDF。message3 输出的是乱码,可能是因为编码不正确。
3 个回答
0
我想你需要多了解一下字符串的编码问题。Python中的字符串本身并没有附带编码信息,所以你需要自己正确使用或者适当地转换它。可以看看Unicode字符串、编码和解码的方法,以及codecs模块。另外,检查一下c.drawString是否也支持传入Unicode字符串,这样可能会让你的工作轻松很多。
1
如果你需要实时检测这些编码,可以看看Mark Pilgrim的一个很棒的开源工具,叫做通用编码检测器。
#!/usr/bin/env python
import chardet
message1 = '\202\261\202\352\202\315\225\275\220\254\226\276\222\251\202\305\202\267\201B'
print chardet.detect(message1)
message3 = '\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88'
print chardet.detect(message3)
str_data = '\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
print chardet.detect(str_data)
输出:
{'confidence': 0.99, 'encoding': 'SHIFT_JIS'}
{'confidence': 0.87625, 'encoding': 'utf-8'}
{'confidence': 0.87625, 'encoding': 'utf-8'}
2
这里是一个回答:
message1 是用 shift_jis
编码的;而 message3 和 str_data 则是用 UTF-8
编码的。它们看起来都是表示日文的内容。请看下面的 IDLE 会话:
>>> message1 = '\202\261\202\352\202\315\225\275\220\254\226\276\222\251\202\305\202\267\201B'
>>> print message1.decode('shift_jis')
これは平成明朝です。
>>> message3 = '\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88'
>>> print message3.decode('UTF-8')
テスト
>>>str_data = '\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e'
>>> print str_data.decode('UTF-8')
日本語
>>>
谷歌翻译检测到这些语言是日文,并将它们翻译成英文,分别是 "这是平成明朝。"、"测试" 和 "日文"。
那问题是什么呢?