如何将 utf-8 花式引号转换为中性引号

Posted

技术标签:

【中文标题】如何将 utf-8 花式引号转换为中性引号【英文标题】:How to convert utf-8 fancy quotes to neutral quotes 【发布时间】: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)?

谢谢

【问题讨论】:

【参考方案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]' 捕获左右双引号。

以上是关于如何将 utf-8 花式引号转换为中性引号的主要内容,如果未能解决你的问题,请参考以下文章

如何将'转换为javascript中的引号?

如何将带单引号的字符串转换为双引号以进行 json 解析

Python如何将单引号转换为双引号以格式化为json字符串

我可以使用 iconv 将多字节智能引号转换为扩展的 ASCII 智能引号吗?

如何将列表转换为字符串并保存它的引号?

如何将不带引号的嵌套字符串字典转换为Python中的字典