Python中的字符编码

1 投票
3 回答
2702 浏览
提问于 2025-04-16 15:52

我有一串字节流,看起来像这样 '\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')
日本語
>>> 

谷歌翻译检测到这些语言是日文,并将它们翻译成英文,分别是 "这是平成明朝。"、"测试" 和 "日文"。

那问题是什么呢?

撰写回答