【问题标题】:Python get ASCII characters [duplicate]Python获取ASCII字符[重复]
【发布时间】:2014-07-19 13:25:27
【问题描述】:

我正在从 Internet 检索数据,我希望它能够将其转换为 ASCII。但我无法修复它。 (Python 2.7)

当我在得到的字符串上使用 decode('utf-8') 时,例如 Yalçınkaya。然而,我希望将其转换为 Yalcinkaya。原始数据是 Yalçınkaya。

谁能帮帮我?

谢谢。

编辑:我已尝试将此问题标记为重复 (What is the best way to remove accents in a Python unicode string?) 的用户提出的建议,但这并没有解决我的问题。

那篇文章主要谈论删除特殊字符,但这并没有解决我将土耳其字符 (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')

【问题讨论】:

  • 编辑:我已经尝试了将这个问题标记为重复的用户提出的建议(在 python unicode 字符串中删除重音的最佳方法是什么?)但这并没有解决我的问题问题。
  • 我重新打开了这个问题,也许您可​​以确切说明为什么这不能解决您的问题,以便您获得合适的建议...
  • 感谢您的编辑。不过还有一件事:您能否提供一个short, self-contained, correct example 来演示您的问题——以便我们能够重现该问题?
  • 您是否尝试过该问题的已接受答案中提到的unidecode 库?对我来说,它会将'Yalçınkaya' 变成'Yalcinkaya'
  • 你确实是对的。不知道我是怎么错过的,但它有效!非常感谢。 (我怎样才能接受你的回答)?)

标签: python ascii decode encode


【解决方案1】:

让我们检查一下 - 首先,我们确实需要了解什么是字符编码和 Unicode。那是非常严重的。我建议您在继续您的项目之前阅读http://www.joelonsoftware.com/articles/Unicode.html。 (顺便说一句,“转换为 ASCII”不是一个普遍有用的解决方案——它更像是一个经纪公司。考虑尝试解析数字,但由于你不理解数字“9”,你决定跳过它) .

也就是说 - 你可以告诉 Python “解码”一个字符串,然后用一个正确的“未知”字符 (u"\ufffd") 替换所选编码的未知字符 - 然后你可以在之前替换那个字符将其重新编码为您的首选输出:raw_data.decode("ASCII", errors="replace")。如果您选择进一步停止解析,您可以使用“忽略”而不是替换:未知字符将被抑制。请记住,您在解码后得到一个“Unicode”对象 - 在将数据输出到任何地方(打印、记录到文件等)之前,您必须对其应用“编码”方法 - 请阅读上面链接的文章。

现在 - 检查您的特定数据 - 特定的 Yalçınkaya 完全是原始 UTF-8 文本,看起来好像是用 latin-1 编码的。像往常一样从 utf-8 解码它,然后使用上面的方法去除重音 - 但请注意,这仅适用于带有变音符号的拉丁字母,并且来自互联网的“世界文本”可能包含各种字符 - 你不应该依赖可转换为 ASCII 的东西。我必须再说一遍:阅读那篇文章,重新思考你的做法。

【讨论】:

    猜你喜欢
    • 2021-01-19
    • 2012-06-08
    • 2017-12-25
    • 1970-01-01
    • 2013-01-11
    • 2015-03-03
    • 1970-01-01
    • 2013-08-07
    • 2020-05-18
    相关资源
    最近更新 更多