【问题标题】:Saving file with Japanese characters in Python 3?在 Python 3 中保存带有日文字符的文件?
【发布时间】:2014-01-21 23:50:01
【问题描述】:

我正在尝试制作一个将文件上传到文件夹的 python 脚本。一切正常,除了我尝试用日文文本保存一个名称的文件,它被切断了。它像 somefile__.zip 一样出来,下划线是日文文本所在的位置。在文件的顶部我设置了 coding: utf-8 但这没有任何效果。这是安全文件名功能的问题还是我遗漏了什么?我的文件管理器可以很好地显示名称中带有日文字符的文件,所以这不是问题。

def upload_file():
if request.method == 'POST': 
    file = request.files['file']
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        if is_image(file.filename):
            filename = shortuuid.uuid()[:7] + "." + file.filename.rsplit(".", 1)[1]
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        else:
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

【问题讨论】:

  • 你在什么平台上?如果是 Windows,您的 OEM 代码页是什么?如果是 Unix,你的默认语言环境是什么? (如果是 OS X,就这么说,我们已经知道答案了。)
  • 添加coding: utf-8 只会影响代码中用于字符串文字的编码,例如"."'file',这显然与您的问题无关。请阅读Unicode HOWTO 并确保您了解问题(如果您仍然不了解,请查看底部的链接以及著名的Spotsky blog);像这样随意改变事情对你没有帮助。
  • 另外,secure_filename 函数是从哪里来的?如果它在您的代码中,请向我们展示代码;如果它来自某个图书馆,请告诉我们是哪一个。
  • 更重要的是,request 来自哪里?它是什么类型的?
  • @abarnert secure_filename 来自 werkzeug utils werkzeug.pocoo.org/docs/utils。正如有人已经说过的那样,它看起来像是只返回一个 ASCII 字符串。该死。我搜索了这个实用程序的 unicode 版本,但什么也没找到。我什至要如何编写自己的版本?从网站上提供的示例来看,它看起来像是从文件名中删除斜杠并用下划线替换空格 - 只需编写一个函数来执行此操作并吐出一个 unicode 字符串就足够了吗?

标签: python unicode


【解决方案1】:

如果没有更多信息,我无法确定这是正确的,我会对此发表评论,但我还没有足够的代表。

我认为你的问题是secure_filename 函数。我真的意识到这是一个 Django 问题。我搜索了secure_filename,发现它来自Werkzeug。在documentation 中,它说secure_filename 函数只返回一个ASCII 字符串。这可能是你的问题。

如果您删除该功能,那么您可以检查它是否有效。

如果您确实需要使文件名安全,您可能需要编写自己的代码来执行此操作,或者找到其他一些库来使用。

也可能是该函数返回一个空文件名,因此您可以使用它,但您有责任检查并处理它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    相关资源
    最近更新 更多