Python读取M4P元数据时看似相同字符串不相等问题排查
Why does a string from mutagen.mp4.MP4 keys not match the literal 'cnam'?
我之前也踩过完全一样的坑!你遇到的核心问题是视觉上完全相同的字符,实际是不同的Unicode码点——虽然打印出来都是"cnam",但其中某个字符根本不是你以为的普通ASCII字符,只是长得一模一样而已。
从你的测试结果就能直接锁定问题:
the_key=='cnam'返回False,说明整体字符串不匹配the_key[0]=='c'也返回False,直接坐实第一个字符有问题- 后面的
n/a能匹配,说明只有个别字符是“冒牌货”
至于为什么print("<{}>".format(the_key))和print(repr(the_key))看起来完全正常?那是因为这两个方法只会显示字符的视觉形态,不会告诉你它的真实编码身份,这才造成了“看起来一样但实际不等”的错觉。
解决步骤
1. 先找出字符的真实Unicode码点
运行这段代码,把每个字符的底层编码打出来,对比正常的'cnam':
# 检查从metadata拿到的键 for idx, char in enumerate(the_key): print(f"Key index {idx}: '{char}' (Unicode: U+{ord(char):04X})") # 检查手动输入的正常字符串 for idx, char in enumerate('cnam'): print(f"Literal index {idx}: '{char}' (Unicode: U+{ord(char):04X})")
你大概率会看到差异——比如第一个字符可能是西里尔字母С(U+0421),或者全角的c(U+FF43),这些字符和普通c视觉上几乎无差别,但编码完全不同。
2. 针对性处理不匹配的键
根据找到的差异,你有两种解决方式:
- 直接使用真实键访问:把从
metadata.keys()里拿到的the_key直接用来访问,或者复制它对应的真实字符(比如如果是西里尔С,就写metadata['Сnam'])。 - Unicode标准化统一字符:如果是编码兼容问题导致的字符差异,可以用Unicode规范化函数把“冒牌”字符转换成标准形式:
import unicodedata # 用NFKC规范化,把视觉等价的字符转成标准ASCII形式 normalized_key = unicodedata.normalize('NFKC', the_key) if normalized_key == 'cnam': print("匹配成功!") # 之后用normalized_key去访问元数据即可
额外提示
mutagen处理MP4元数据时,偶尔会遇到苹果生态下的特殊标签字符,不过你这个情况完全是字符编码的“视觉欺骗”问题,和标签命名规则无关。
内容的提问来源于stack exchange,提问作者Self Dot
相关产品推荐
相关产品推荐

