使用unicode以任何语言保存文件

 wqp2012 发布于 2022-12-04 02:05

我正在创建一个简单的脚本,它使用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()把问题弄清楚.对不起

1 个回答
  • raw_input() 字符串由终端或控制台编码,因此您可以要求终端或控制台使用正确的编解码器.

    Python已经在启动时完成了这项工作,并将编解码器存储在sys.stdin.encoding:

    import sys
    
    filename = raw_input("Enter pdf filename: ")
    filename = filename.decode(sys.stdin.encoding)
    

    从您指出的注释中,文件名实际上并非来自raw_input().对于不同的源,您需要使用不同的技术来检测使用的字符集.

    例如,HTTP响应可以charsetContent-Type标题中包括参数; a urlliburllib2响应允许您使用以下内容提取:

    encoding = response.info().getparam('charset')
    

    这仍然可以返回None,此时它取决于返回的确切mimetype.text/mimetypes(例如HTML)的默认值是Latin-1,但HTML标准还允许<meta>文档中的标题告诉您使用的字符集.对于HTML,我使用BeautifulSoup来解析响应,它会为你检测字符集.

    但是,如果没有关于如何从URL 实际加载文件名的更多信息,我不能说更具体的内容.

    2022-12-11 02:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有