如何在Mac OS High Sierra通过convmv将UTF8 NFC文件转为UTF8 NFD?
解决Mac上用convmv将UTF-8 NFC转换为NFD的问题
我之前也踩过APFS不再自动转编码的坑,特别理解你依赖NFD格式的困扰,咱们一步步来搞定这个问题:
先排查最容易犯的小错误——没实际执行转换
convmv默认是模拟运行模式,只会输出要修改的文件名,但不会真的改动文件。你必须加上--notest参数,命令才会实际执行转换操作。
正确的转换命令格式
针对UTF-8内部的NFC→NFD等价转换,正确的命令应该是这样的:
# 转换单个文件 convmv -f utf8 -t utf8 --nfd --notest /path/to/your/file # 递归转换目录下所有文件(包括子目录) convmv -f utf8 -t utf8 --nfd --notest -r /path/to/your/directory
参数说明:
-f utf8 -t utf8:因为是UTF-8编码内部的等价转换,源和目标编码都设为UTF-8--nfd:明确指定要转换为NFD格式--notest:关闭模拟模式,真正修改文件名-r:递归处理目录下的所有子文件和子目录
为什么重复执行没变化?
如果加了--notest还是没效果,大概率是文件已经是NFD格式了,你可以用以下命令验证:
# 测试文件是否为NFC格式(如果输出显示需要转换,说明当前是NFD) convmv -f utf8 -t utf8 --nfc --dry-run /path/to/your/file
如果输出里出现already in correct encoding,说明文件已经是你需要的NFD格式,重复执行自然不会有变化。
其他可能的问题点
- 权限不足:如果转换的是系统目录下的文件,需要加上
sudo提升权限 - 符号链接未处理:如果要转换符号链接的文件名,需额外加
--links参数 - 隐藏文件遗漏:要处理隐藏文件的话,可以用
convmv -f utf8 -t utf8 --nfd --notest -r /path/to/dir/.*(注意不要漏掉.)
验证转换是否成功
你可以通过查看文件名的字节编码来确认:
# 查看文件名的十六进制字节 ls /path/to/your/file | od -t x1
举个例子,字符é在NFC中是C3 A9,在NFD中是65 CC 81,对比字节就能确认转换是否生效。
内容的提问来源于stack exchange,提问作者Karl Scholze
相关产品推荐
相关产品推荐

