主頁(yè) > 知識(shí)庫(kù) > Python如何解決secure_filename對(duì)中文不支持問題

Python如何解決secure_filename對(duì)中文不支持問題

熱門標(biāo)簽:長(zhǎng)春極信防封電銷卡批發(fā) 企業(yè)彩鈴地圖標(biāo)注 煙臺(tái)電話外呼營(yíng)銷系統(tǒng) 電銷機(jī)器人錄音要學(xué)習(xí)什么 上海正規(guī)的外呼系統(tǒng)最新報(bào)價(jià) 外賣地址有什么地圖標(biāo)注 預(yù)覽式外呼系統(tǒng) 銀川電話機(jī)器人電話 如何地圖標(biāo)注公司

前言:最近使用到了secure_filename,然后悲劇的發(fā)現(xiàn)中文居然不展示出來,于是我慢慢的debug,終于找到問題了。

一、最近使用secure_filename發(fā)現(xiàn)的問題

文件名是中文版的,悲劇的是中文以及其他特殊字符會(huì)被省略。

二、后面找到了原因

原來secure_filename()函數(shù)只返回ASCII字符,非ASCII字符會(huì)被過濾掉。

三、解決方案

找到secure_filename(filename)函數(shù),修改它的源代碼。

secure_filename(filename)函數(shù)源代碼:
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)函數(shù)修改后的代碼:

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('._')             # 添加新規(guī)則

    # 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

四、效果展示

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

到此這篇關(guān)于Python如何解決secure_filename對(duì)中文不支持問題的文章就介紹到這了,更多相關(guān)Python secure_filename不支持中文內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python 中文亂碼問題深入分析
  • python中文亂碼的解決方法
  • Python使用中文正則表達(dá)式匹配指定中文字符串的方法示例
  • Python的shutil模塊中文件的復(fù)制操作函數(shù)詳解
  • python實(shí)現(xiàn)中文輸出的兩種方法
  • python實(shí)現(xiàn)中文轉(zhuǎn)換url編碼的方法
  • Python中使用中文的方法
  • 解決vscode python print 輸出窗口中文亂碼的問題
  • python中Pycharm 輸出中文或打印中文亂碼現(xiàn)象的解決辦法
  • wxPython中文教程入門實(shí)例

標(biāo)簽:西寧 佳木斯 潮州 湖北 珠海 上饒 宜昌 盤錦

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python如何解決secure_filename對(duì)中文不支持問題》,本文關(guān)鍵詞  Python,如何,解決,secure,filename,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Python如何解決secure_filename對(duì)中文不支持問題》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Python如何解決secure_filename對(duì)中文不支持問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章