【问题标题】:How to convert utf-8 fancy quotes to neutral quotes如何将 utf-8 花式引号转换为中性引号
【发布时间】:2015-05-12 17:04:20
【问题描述】:

我正在编写一个 Python 小脚本,用于解析 word 文档并写入 csv 文件。但是,有些文档有一些我的脚本无法正确处理的 utf-8 字符。

花哨的引号经常出现 (u'\u201c')。是否有一种快速简单(且智能)的方法可以用支持 ascii 的中性引号替换那些引号,这样我就可以将 line.encode('ascii') 写入 csv 文件?

我试图找到左引号并替换它:

val = line.find(u'\u201c')
if val >= 0: line[val] = '"'

但无济于事:

TypeError: 'unicode' object does not support item assignment

我所描述的是一个好的策略吗?或者我应该只设置 csv 以支持 utf-8(尽管我不确定将读取 CSV 的应用程序是否需要 utf-8)?

谢谢

【问题讨论】:

    标签: python python-2.7 unicode encoding utf-8


    【解决方案1】:

    您可以使用Unidecode package 自动将所有 Unicode 字符转换为最接近的纯 ASCII 字符。

    from unidecode import unidecode
    line = unidecode(line)
    

    这将处理双引号的两个方向以及单引号、破折号以及您可能尚未发现的其他内容。

    编辑:评论指出,如果您的语言不是英语,您可能会发现 ASCII 过于严格。这是对上述代码的改编,它使用白名单来指示不应转换的字符。

    >>> from unidecode import unidecode
    >>> whitelist = set('µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ')
    >>> line = '\u201cRésumé\u201d'
    >>> print(line)
    “Résumé”
    >>> line = ''.join(c if c in whitelist else unidecode(c) for c in line)
    >>> print(line)
    "Résumé"
    

    【讨论】:

    • 想知道为什么不......“2021 年综合拨款法案”。第 107-171 条公法第 6402 条。 105–83:用于“农村和开支”。为“农场和开支”部门打出“2010 年至 2021 年”
    • @gseattle 你的评论有道理吗?对我来说看起来充满了mojibake。
    • 英文效果很好...其他语言...不太好。
    • @rubmz 非常好。查看我的编辑。
    【解决方案2】:

    您不能分配给字符串,因为它们是不可变的,并且无法更改。

    但是,您可以只使用正则表达式库,这可能是最灵活的方法:

    import re
    newline = re.sub(u'\u201c','"',line)
    

    【讨论】:

    • 您可能想用u'[\u201c\u201d]' 捕获左右双引号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多