如何将 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 花式引号转换为中性引号的主要内容,如果未能解决你的问题,请参考以下文章
Python如何将单引号转换为双引号以格式化为json字符串