Python 获取 ASCII 字符

-1 投票
1 回答
800 浏览
提问于 2025-04-18 13:57

我正在从网上获取数据,想把它转换成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 个回答

0

首先,我们得搞清楚什么是字符编码和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。我再说一遍:请阅读那篇文章,重新思考你的做法。

撰写回答