我正在创建一个简单的脚本,它使用Reportlab pdf生成模块将图像列表作为输入并输出pdf文件.该脚本采用如上所示的文件名:
from reportlab.pdfgen import canvas filename = raw_input("Enter pdf filename: ") c = canvas.Canvas(filename + ".pdf") c.save()
一切都很棒,直到用户输入非英语文件名(希伯来语,阿拉伯语),导致代码抛出以下异常:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf9 in position 0: invalid start byte
所以,我决定使用unicode,但是当我使用unicode()
它时会抛出另一个例外:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf9 in position 0: ordinal not in range(128)
但是,当我解码字符串编码时,它就像一个魅力(希伯来语示例):
from reportlab.pdfgen import canvas filename = raw_input("Enter pdf filename: ") filename = filename.decode("windows-1255") c = canvas.Canvas(filename + ".pdf") c.save()
我继续尝试另一种方法,并发现如果我u
在上面的例子中写字符串之前,它可以用任何语言工作:
from reportlab.pdfgen import canvas filename = u"?" #arabic c = canvas.Canvas(filename + ".pdf") c.save()
问题是我不知道应该使用什么编码.输入字符串可以是任何语言.我该怎么做才能解决它,或者换句话说:如何u
在字符串之前添加编码时没有语法?
PS:如果你有更好的头衔,请在下面写下我
编辑:文件名实际上是从网站提供的(我用urllib
).我并不认为这很重要,我过去常常raw_input()
把问题弄清楚.对不起
raw_input()
字符串由终端或控制台编码,因此您可以要求终端或控制台使用正确的编解码器.
Python已经在启动时完成了这项工作,并将编解码器存储在sys.stdin.encoding
:
import sys filename = raw_input("Enter pdf filename: ") filename = filename.decode(sys.stdin.encoding)
从您指出的注释中,文件名实际上并非来自raw_input()
.对于不同的源,您需要使用不同的技术来检测使用的字符集.
例如,HTTP响应可以charset
在Content-Type
标题中包括参数; a urllib
或urllib2
响应允许您使用以下内容提取:
encoding = response.info().getparam('charset')
这仍然可以返回None
,此时它取决于返回的确切mimetype.text/
mimetypes(例如HTML)的默认值是Latin-1,但HTML标准还允许<meta>
文档中的标题告诉您使用的字符集.对于HTML,我使用BeautifulSoup来解析响应,它会为你检测字符集.
但是,如果没有关于如何从URL 实际加载文件名的更多信息,我不能说更具体的内容.