【问题标题】:Python - Unicode to ASCII conversionPython - Unicode 到 ASCII 转换
【发布时间】:2013-10-22 20:05:57
【问题描述】:

我无法在不丢失数据的情况下将以下 Unicode 转换为 ASCII:

u'ABRA\xc3O JOS\xc9'

我尝试了encodedecode,但他们不会这样做。

有人有什么建议吗?

【问题讨论】:

  • 您是否真的需要编码为 ASCII,或者只是“一些 8 位字符集”或“我的平台的默认 8 位字符集”或类似的东西?
  • 它是 ASCII。数据库连接设置为 ASCII。
  • 作为参考,Unicode 中的字符串看起来像 ABRAÃO JOSÉ

标签: python unicode encoding ascii


【解决方案1】:

我发现https://pypi.org/project/Unidecode/ 这个库非常有用

>>> from unidecode import unidecode
>>> unidecode('ko\u017eu\u0161\u010dek')
'kozuscek'
>>> unidecode('30 \U0001d5c4\U0001d5c6/\U0001d5c1')
'30 km/h'
>>> unidecode('\u5317\u4EB0')
'Bei Jing '

【讨论】:

    【解决方案2】:

    Unicode 字符 u'\xce0'u'\xc9' 没有任何对应的 ASCII 值。因此,如果您不想丢失数据,则必须以某种作为 ASCII 有效的方式对该数据进行编码。选项包括:

    >>> print s.encode('ascii', errors='backslashreplace')
    ABRA\xc3O JOS\xc9
    >>> print s.encode('ascii', errors='xmlcharrefreplace')
    ABRAÃO JOSÉ
    >>> print s.encode('unicode-escape')
    ABRA\xc3O JOS\xc9
    >>> print s.encode('punycode')
    ABRAO JOS-jta5e
    

    所有这些都是 ASCII 字符串,并且包含原始 Unicode 字符串中的所有信息(因此它们都可以在不丢失数据的情况下进行反转),但是对于最终用户来说,它们都不是那么漂亮(而且没有可以通过decode('ascii') 反转它们。

    有关详细信息,请参阅 str.encodePython Specific EncodingsUnicode HOWTO


    作为旁注,当有些人说“ASCII”时,他们实际上并不是指“ASCII”,而是“作为 ASCII 超集的任何 8 位字符集”或“某些特定的 8 位字符集我心里有数”。如果这就是您的意思,解决方案是编码为正确的 8 位字符集:

    >>> s.encode('utf-8')
    'ABRA\xc3\x83O JOS\xc3\x89'
    >>> s.encode('cp1252')
    'ABRA\xc3O JOS\xc9'
    >>> s.encode('iso-8859-15')
    'ABRA\xc3O JOS\xc9'
    

    困难的部分是知道你指的是哪个字符集。如果您正在编写生成 8 位字符串的代码和使用它的代码,并且您不知道更好,那么您的意思是 UTF-8。如果使用 8 位字符串的代码是 open 函数或您正在向其提供页面的 Web 浏览器或其他东西,那么事情会更加复杂,如果没有更多信息,就没有简单的答案.

    【讨论】:

    • 谢谢。这有帮助。我已经完成了 xmlcharrefreplace,但是当我写入 Oracle DB 时,它在我的字符串中放入了垃圾。我解决了更改 NLS_LANG 参数的问题。 os.environ["NLS_LANG"] = "AMERICAN_AMERICA.WE8ISO8859P1" 然后转换为“latin-1”
    • @AdrianoAlmeida:请注意,尽管 Latin-1/ISO-8859-1 确实可以处理您现有的两个字符,但它不能处理大多数 Unicode。因此,一旦有人试图给你一个俄语或中文名字,你就会得到一个UnicodeError。如果您可以将 Oracle 设置为使用 UTF-8,您将避免将来出现任何此类问题。如果你不能……记住这一点,并相应地设计你的测试。
    【解决方案3】:

    我需要计算在HTTP request 中收到的unicode stringMD5 hash。 MD5 给出了UnicodeEncodeError,而python 内置编码方法不起作用,因为它用相应的hex values 替换字符串中的字符,从而改变了MD5 hash。 所以我想出了下面的代码,它在从unicode转换时保持字符串不变。

    unicode_string = ''.join([chr(ord(x)) for x in unicode_string]).strip()
    

    这会从字符串中删除unicode 部分并保持所有数据完整。

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2013-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2011-09-26
      • 2015-05-08
      相关资源
      最近更新 更多