在Python中将Unicode字符串近似转换为ASCII字符串

29

不知道这是否微不足道,但我需要将Unicode字符串转换为ASCII字符串,并且我不想在周围有所有这些转义字符。我的意思是,是否可能将其“近似”转换为一些相当类似的ASCII字符?

例如:Gavin O’Connor被转换为Gavin O\x92Connor,但我真的希望它只被转换为Gavin O'Connor。这可能吗?是否有人编写了一些实用程序来执行此操作,还是我必须手动替换所有字符?

非常感谢! 马尔科


3
请查看此链接:https://dev59.com/O3RA5IYBdhLWcg3wzhbZ - Facundo Casco
1
你所尝试实现的并不是一个理想的方案。你可能会不断地添加新的替换方式。如果你能解释为什么需要这样做,以及为什么必须使用 ASCII 而不是 Unicode,那就太好了。 - sorin
@sorin:如果您使用的实用程序已经替换了所有Unicode字符,那就不用担心了。 - Petr Viktorin
5个回答

38

使用Unidecode包来对字符串进行音译。

>>> import unidecode
>>> unidecode.unidecode(u'Gavin O’Connor')
"Gavin O'Connor"

1
刚刚安装了它.. 但是..
导入unidecode unidecode.unidecode(u'Gavin O’Connor') "Gavin OConnor"
- Marco Moschettini
1
这意味着'是一个Unicode字符,没有ASCII等效项。至少在Python中,'不是。您可能希望创建一个特殊字符的字典,并存储类似外观的ASCII字符。然后,您可以将Unicode字符替换为相应的ASCII字符。 - D K

12
import unicodedata

unicode_string = u"Gavin O’Connor"
print unicodedata.normalize('NFKD', unicode_string).encode('ascii','ignore')

输出:

Gavin O'Connor

这里有一个描述规范化形式的文档: http://unicode.org/reports/tr15/


1
这只是从示例输入字符串中删除撇号。OP正在寻找一种将其替换为“足够接近”的ASCII单引号字符的方法。 - slowdog
嗯,在我的电脑上它给出了上面的输出,但是在尝试在其他地方做同样的事情时,撇号就被移除了...奇怪。 - Acorn
1
使用我的Python 2.6.6版本,unicodedata.normalize('NFKD', u'Gavin O\u2019Connor') == u'Gavin O\u2019Connor',以及u'Gavin O\u2019Connor'.encode('ascii', 'ignore') == 'Gavin OConnor'。我对你链接的标准感到非常困惑,所以我无法确定这是unicodedata.normalize的错误还是正确行为。 - slowdog
在2.6.5中,unicodedata.normalize('NFKD',u"Gavin O'Connor"). encode('ascii', 'ignore')会给我返回 "Gavin O'Connor" - Acorn

9
b = str(a.encode('utf-8').decode('ascii', 'ignore'))

应该可以正常工作。

它不起作用。当我尝试时,它只是删除所有的非ASCII字符。 - sudo

2

-2

尝试简单的字符替换

str1 = "“I am the greatest”, said Gavin O’Connor"
print(str1)
print(str1.replace("’", "'").replace("“","\"").replace("”","\""))

附注:如果您遇到error的情况,请在您的.py文件顶部添加# -*- coding: utf-8 -*-


2
有许多其他常用的Unicode字符,它们与看起来相似的ASCII版本非常相似,例如各种破折号和连字符。手动处理这些太困难了。 - sudo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接