os.scandir读取文件名后URL编码异常的解决方案咨询
解决os.scandir读取文件名URL编码与手动输入不一致的问题
问题本质
这是Unicode规范化形式的差异导致的:
- 通过
os.scandir读取的文件名采用**NFD(标准等价分解)**格式:每个韩文字符被拆成多个基础Unicode码点(比如辅音、元音组合),URL编码后会生成一串较长的%xx片段 - 手动输入的字符串是**NFC(标准等价合成)**格式:每个完整韩文字符对应单个Unicode码点,URL编码后是更紧凑的
%xx片段
两种形式解码后显示的文字完全相同,但很多服务端仅支持NFC形式的编码参数,所以前者会请求失败。
解决方案
用Python的unicodedata模块将读取到的文件名转换为NFC规范形式,再执行URL编码。修改后的代码如下:
import os from urllib import parse import unicodedata files = os.scandir('paths to specific folders') for file in files: raw_name = file.name[15:].split('~')[0] # 转换为NFC标准合成形式 normalized_name = unicodedata.normalize('NFC', raw_name) print(normalized_name) print(parse.quote(normalized_name))
效果验证
转换后的文件名与手动输入的字符串具有完全一致的Unicode规范,此时parse.quote生成的编码结果会和手动输入的完全相同,能够正常作为请求参数使用。
内容的提问来源于stack exchange,提问作者TAMDAO diptyque
相关产品推荐
相关产品推荐

