You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:56:42