如何将Mac文件名中分解型重音字符转换为组合型Unicode字符?
解决Mac文件名Unicode规范化转换问题
这里有几种实用的方案,帮你把包含预组合重音字符(áéíóúÁÉÍÓÚ)的文件名转换成基础字符+组合重音符的版本,同时满足分解型字符转HTML实体的需求:
方法1:Python脚本(灵活易定制)
Python的unicodedata模块原生支持Unicode规范化,非常适合处理这类文件名转换需求。
1.1 批量转换文件名到组合型字符(NFD格式)
下面的脚本会遍历指定目录,把所有预组合重音字符分解成「基础字符+组合重音符」的形式(也就是Mac默认存储的格式):
import os import unicodedata def convert_filenames_to_nfd(target_dir): # 先处理子目录再处理文件,避免路径错乱 for root, dirs, files in os.walk(target_dir, topdown=False): # 处理文件 for filename in files: # 转换为NFD(分解型Unicode格式) nfd_name = unicodedata.normalize('NFD', filename) if nfd_name != filename: old_path = os.path.join(root, filename) new_path = os.path.join(root, nfd_name) # 避免覆盖已存在的文件 if not os.path.exists(new_path): os.rename(old_path, new_path) print(f"已重命名: {filename} → {nfd_name}") else: print(f"跳过: {new_path} 已存在") # 处理目录 for dirname in dirs: nfd_dir = unicodedata.normalize('NFD', dirname) if nfd_dir != dirname: old_path = os.path.join(root, dirname) new_path = os.path.join(root, nfd_dir) if not os.path.exists(new_path): os.rename(old_path, new_path) print(f"已重命名目录: {dirname} → {nfd_dir}") else: print(f"跳过目录: {new_path} 已存在") # 替换成你的目标目录路径 convert_filenames_to_nfd("/Users/you/target-folder")
核心逻辑:unicodedata.normalize('NFD', text)会自动把预组合字符(比如á=U+00E1)分解成基础字符+组合标记(a+U+0301)。
1.2 把分解型字符转成HTML实体
如果需要将「A+组合重音符」这类分解型字符转换为Á这样的HTML实体,可以用这段代码:
import unicodedata def decomposed_to_html_entity(text): # 先把分解型转成预组合型(NFC格式) nfc_text = unicodedata.normalize('NFC', text) result = [] for char in nfc_text: # 只处理指定的重音字符 if char in {'á','é','í','ó','ú','Á','É','Í','Ó','Ú'}: result.append(f"&#{ord(char)};") else: result.append(char) return ''.join(result) # 测试示例:分解型的Á(A+U+0301) test_input = 'A' + '\u0301' print(decomposed_to_html_entity(test_input)) # 输出:Á
方法2:Mac终端Shell脚本
如果你习惯用终端操作,可以用Perl的Unicode模块来实现批量转换:
#!/bin/bash # 替换成你的目标目录 TARGET_DIR="/Users/you/target-folder" cd "$TARGET_DIR" || exit # 深度优先遍历,避免目录重命名后路径失效 find . -depth -name "*[áéíóúÁÉÍÓÚ]*" | while read -r item; do dir_path=$(dirname "$item") file_name=$(basename "$item") # 用Perl转换为NFD格式 nfd_name=$(perl -CS -MUnicode::Normalize -e 'print NFD($ARGV[0])' "$file_name") if [ "$nfd_name" != "$file_name" ]; then new_path="$dir_path/$nfd_name" if [ ! -e "$new_path" ]; then mv "$item" "$new_path" echo "已重命名: $item → $new_path" else: echo "跳过: $new_path 已存在" fi fi done
注意:如果提示缺少Unicode::Normalize模块,可通过cpan Unicode::Normalize安装(Mac自带Perl一般已包含)。
关键提示
- Unicode的
NFD格式就是你需要的「组合型字符版本」,而NFC是预组合格式,对应反向转换需求; - 处理文件名时一定要深度优先遍历(Python的
topdown=False、Shell的find -depth),避免先重命名目录导致后续文件路径找不到的问题。
内容的提问来源于stack exchange,提问作者Baz
相关产品推荐
相关产品推荐

