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中必会的四大高级数据类型(字符,元组,列表,字典),本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-05-05Python Diagrams创建高质量图表和流程图实例探究
Python Diagrams是一个强大的Python库,使创建这些图表变得简单且灵活,本文将深入介绍Python Diagrams,包括其基本概念、安装方法、示例代码以及一些高级用法,以帮助大家充分利用这一工具来创建令人印象深刻的图表2024-01-01
最新评论