目录
- 一、最近使用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中文教程入门实例