【问题标题】:unicodedata.normalize is missing one character doing conversionunicodedata.normalize 缺少一个字符进行转换
【发布时间】:2019-11-07 18:32:16
【问题描述】:

我正在尝试使用以下脚本重命名文件,但在捕捉以下“不”时遇到问题,该“不”最终应为“不”。关于如何做到这一点的任何想法?

def remove_accents(s): 
    nkfd_form = unicodedata.normalize('NFKD', s) 
    return u''.join([c for c in nkfd_form if not unicodedata.combining(c)])

for fname in glob.glob("**/*.mp3", recursive=True):
    new_fname = remove_accents(fname)
    if new_fname != fname:
        try:
            print ('renaming non-ascii filename to', new_fname)
            os.rename(fname, new_fname)
        except Exception as e:
            print (e)

【问题讨论】:

    标签: python unicode unicode-normalization


    【解决方案1】:

    错误的工作工具 - unicodedata.normalize 根本不是为了消除重音。

    要向下转换为 ascii,请查看 unidecode

    >>> from unidecode import unidecode
    >>> unidecode("Don’t")
    "Don't"
    

    【讨论】:

    • 但是第一个重音不是应该由规范化处理并转换为正常的“'”的字符吗,就像其他正确变化的拉丁字符一样?
    • @Gromit,不,不是。就像 wim 说的那样,这与删除(或替换)重音无关。文档(上面答案中提供的直接链接)解释了该方法的作用:简单地说,它确保 look 相同的字符 encoded 相同,这使得(二进制)比较容易。例如,'\u00c7' == '\u0043\u0327' 为 False,但如果您打印两个字符串,它们看起来是一样的。以下确实返回 True:unicodedata.normalize('NFKD', '\u00c7') == unicodedata.normalize('NFKD', '\u0043\u0327')。但是这个方法对你的应用没有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2014-07-20
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多