Python 获取 ASCII 字符
我正在从网上获取数据,想把它转换成ASCII格式。但是我遇到了一些问题。(Python 2.7)
当我对获取到的字符串使用decode('utf-8')时,比如我得到了Yalçınkaya。但是我希望它能转换成Yalcinkaya。原始数据是Yalçınkaya。
有没有人能帮我解决这个问题?
谢谢。
编辑:我尝试了一个用户建议的方法,他把这个问题标记为重复问题(在Python Unicode字符串中去掉重音符号的最佳方法是什么?),但这并没有解决我的问题。
那篇文章主要讲的是去掉特殊字符,但这并没有解决我想把土耳其字符(Yalçınkaya)替换成它们的ASCII字符(Yalcinkaya)的问题。
# Printing the raw string in Python results in "Yalçınkaya".
# When applying unicode to utf8 the string changes to 'Yalçınkaya'.
# HTMLParser is used to revert special characters such as commas
# FKD normalize is used, which converts the string to 'Yalçınkaya'.
# Applying ASCII encoding results in 'Yalcnkaya', missing the original turkish 'i' which is not what I wanted.
name = unicodedata.normalize('NFKD', unicode(name, 'utf8'))
name = HTMLParser.HTMLParser().unescape(name)
name = unicodedata.normalize('NFKD', u'%s' %name).encode('ascii', 'ignore')
1 个回答
首先,我们得搞清楚什么是字符编码和Unicode。这非常重要。我建议你在继续项目之前,先看看这个链接:http://www.joelonsoftware.com/articles/Unicode.html。(顺便说一下,“转换为ASCII”并不是一个普遍有用的解决方案,这更像是个中介。想象一下,你在解析数字,但你不理解数字“9”,于是你决定直接跳过它。)
说到这,你可以告诉Python去“解码”一个字符串,并把选定编码中未知的字符替换成一个合适的“未知”字符(u"\ufffd")。然后你可以在重新编码成你想要的格式之前,把这个字符替换掉:raw_data.decode("ASCII", errors="replace")
。如果你想进一步简化解析,可以用“ignore”来代替替换:这样未知的字符就会被忽略掉。记住,解码后你会得到一个“Unicode”对象,在把数据输出到任何地方(比如打印、写入文件等)之前,你需要对它使用“encode”方法——请务必阅读上面提到的文章。
现在,针对你的具体数据,Yalçınkaya
实际上是原始的UTF-8文本,看起来像是用latin-1编码的。只需像往常一样从utf-8解码,然后使用上面的方法去掉重音符号。但要注意,这只适用于带有变音符号的拉丁字母,而来自互联网的“世界文本”可能包含各种各样的字符——你不应该指望所有东西都能转换为ASCII。我再说一遍:请阅读那篇文章,重新思考你的做法。