Python如何解決secure_filename對(duì)中文不支持問(wèn)題
前言:最近使用到了secure_filename,然后悲劇的發(fā)現(xiàn)中文居然不展示出來(lái),于是我慢慢的debug,終于找到問(wèn)題了。
一、最近使用secure_filename發(fā)現(xiàn)的問(wèn)題文件名是中文版的,悲劇的是中文以及其他特殊字符會(huì)被省略。
原來(lái)secure_filename()函數(shù)只返回ASCII字符,非ASCII字符會(huì)被過(guò)濾掉。
三、解決方案找到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 xfcmlxe4uts.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 filenameand 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 xfcmlxe4uts.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-u9FBFu3040-u30FFu31F0-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 filenameand filename.split('.')[0].upper() in _windows_device_files ):filename = f'_{filename}' return filename四、效果展示
我們很清楚的看到了效果,目前是支持中文的
到此這篇關(guān)于Python如何解決secure_filename對(duì)中文不支持問(wèn)題的文章就介紹到這了,更多相關(guān)Python secure_filename不支持中文內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. SpringBoot 開(kāi)發(fā)提速神器 Lombok+MybatisPlus+SwaggerUI2. 10個(gè)提供免費(fèi)PHP腳本下載的網(wǎng)站3. js實(shí)現(xiàn)跳一跳小游戲4. php5.6不能擴(kuò)展redis.so的解決方法5. js實(shí)現(xiàn)貪吃蛇小游戲(加墻)6. 使用idea 去除 html 代碼前的行號(hào)和空行的方法詳解7. JVM之class文件結(jié)構(gòu)8. PHP設(shè)計(jì)模式(四)原型模式Prototype實(shí)例詳解【創(chuàng)建型】9. Python編寫(xiě)nmap掃描工具10. python 爬取嗶哩嗶哩up主信息和投稿視頻
