• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Python如何解决secure_filename对中文不支持问题

    前言:最近使用到了secure_filename,然后悲剧的发现中文居然不展示出来,于是我慢慢的debug,终于找到问题了。

    一、最近使用secure_filename发现的问题

    文件名是中文版的,悲剧的是中文以及其他特殊字符会被省略。

    二、后面找到了原因

    原来secure_filename()函数只返回ASCII字符,非ASCII字符会被过滤掉。

    三、解决方案

    找到secure_filename(filename)函数,修改它的源代码。

    secure_filename(filename)函数源代码:
    def secure_filename(filename: str) -> str:
        r"""Pass it a filename and it will return a secure version of it.  This
        filename can then safely be stored on a regular file system and passed
        to :func:`os.path.join`.  The filename returned is an ASCII only string
        for maximum portability.
    
        On windows systems the function also makes sure that the file is not
        named after one of the special device files.
    
        >>> secure_filename("My cool movie.mov")
        'My_cool_movie.mov'
        >>> secure_filename("../../../etc/passwd")
        'etc_passwd'
        >>> secure_filename('i contain cool \xfcml\xe4uts.txt')
        'i_contain_cool_umlauts.txt'
    
        The function might return an empty filename.  It's your responsibility
        to ensure that the filename is unique and that you abort or
        generate a random filename if the function returned an empty one.
    
        .. versionadded:: 0.5
    
        :param filename: the filename to secure
        """
        filename = unicodedata.normalize("NFKD", filename)
        filename = filename.encode("ascii", "ignore").decode("ascii")
    
        for sep in os.path.sep, os.path.altsep:
            if sep:
                filename = filename.replace(sep, " ")
        filename = str(_filename_ascii_strip_re.sub("", "_".join(filename.split()))).strip(
            "._"
        )
    
        # on nt a couple of special files are present in each folder.  We
        # have to ensure that the target file is not such a filename.  In
        # this case we prepend an underline
        if (
            os.name == "nt"
            and filename
            and filename.split(".")[0].upper() in _windows_device_files
        ):
            filename = f"_{filename}"
    
        return filename
    

    secure_filename(filename)函数修改后的代码:

    def secure_filename(filename: str) -> str:
        r"""Pass it a filename and it will return a secure version of it.  This
        filename can then safely be stored on a regular file system and passed
        to :func:`os.path.join`.  The filename returned is an ASCII only string
        for maximum portability.
    
        On windows systems the function also makes sure that the file is not
        named after one of the special device files.
    
        >>> secure_filename("My cool movie.mov")
        'My_cool_movie.mov'
        >>> secure_filename("../../../etc/passwd")
        'etc_passwd'
        >>> secure_filename('i contain cool \xfcml\xe4uts.txt')
        'i_contain_cool_umlauts.txt'
    
        The function might return an empty filename.  It's your responsibility
        to ensure that the filename is unique and that you abort or
        generate a random filename if the function returned an empty one.
    
        .. versionadded:: 0.5
    
        :param filename: the filename to secure
        """
        filename = unicodedata.normalize("NFKD", filename)
        filename = filename.encode("utf8", "ignore").decode("utf8")   # 编码格式改变
    
        for sep in os.path.sep, os.path.altsep:
            if sep:
                filename = filename.replace(sep, " ")
        _filename_ascii_add_strip_re = re.compile(r'[^A-Za-z0-9_\u4E00-\u9FBF\u3040-\u30FF\u31F0-\u31FF.-]')
        filename = str(_filename_ascii_add_strip_re.sub('', '_'.join(filename.split()))).strip('._')             # 添加新规则
    
        # on nt a couple of special files are present in each folder.  We
        # have to ensure that the target file is not such a filename.  In
        # this case we prepend an underline
        if (
            os.name == "nt"
            and filename
            and filename.split(".")[0].upper() in _windows_device_files
        ):
            filename = f"_{filename}"
    
        return filename
    
    

    四、效果展示

    我们很清楚的看到了效果,目前是支持中文的

    到此这篇关于Python如何解决secure_filename对中文不支持问题的文章就介绍到这了,更多相关Python secure_filename不支持中文内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • python 中文乱码问题深入分析
    • python中文乱码的解决方法
    • Python使用中文正则表达式匹配指定中文字符串的方法示例
    • Python的shutil模块中文件的复制操作函数详解
    • python实现中文输出的两种方法
    • python实现中文转换url编码的方法
    • Python中使用中文的方法
    • 解决vscode python print 输出窗口中文乱码的问题
    • python中Pycharm 输出中文或打印中文乱码现象的解决办法
    • wxPython中文教程入门实例
    上一篇:利用Matlab绘制各类特殊图形的实例代码
    下一篇:Python多个MP4合成视频的实现方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Python如何解决secure_filename对中文不支持问题 Python,如何,解决,secure,filename,