【问题标题】:Python string cent symbol conversionPython字符串分符号转换
【发布时间】:2016-05-30 21:57:05
【问题描述】:

我的字符串是

u'3.4\xa2 / each'

'\xa2' 是“分”符号,我想这样表示。

我试过了

i= "3.4\xa2 / each"
print unicode(i, errors='replace')

在结果中,分号显示为实心圆圈内的问号。

我也试过

i= "3.4\xa2 / each"
print i.encode('utf-8')

我明白了

UnicodeDecodeError: 'ascii' codec can't decode byte 0xa2 in position 3: ordinal not in range(128)

那么正确的方法是什么?

【问题讨论】:

  • 您使用的是什么操作系统?在 Ubuntu 14.04 上,print u'3.4\xa2 / each' 正确显示 3.4¢ / each/
  • @Robᵩ:啊,但是您创建了一个 unicode 字符串文字。一开始的那个小u..
  • OP 也是如此,在问题的第 1 行。
  • 啊,但不是在第二个代码sn-p中。我想知道他到底有哪个?
  • @Robᵩ;好问题,但鉴于 encode 失败了,它不是 Unicode 字符串。

标签: python python-2.7 unicode


【解决方案1】:

'\xa2' 是一个字节。它可能被解释为一个分号,但前提是您指定了正确的编解码器。通过指定正确的编解码器,您可以将其解码为等效的 Unicode 代码点。 Latin-1 会这样做:

>>> print '\xa2'.decode('latin1')
¢

不过,有一个完整的 series of encodings¢ 分码点编码为 A2。

或者,以 Unicode 字符串开头。 Unicode 字符串表达式中的\xa2\u00a2 相同,恰好是正确的代码点:

>>> print u'\xa2'
¢
>>> print u'\u00a2'
¢

这是因为 Unicode 标准的前 256 个代码点恰好与 Latin-1 (ISO-8859-1) 标准匹配。

您可能无法打印;如果您使用的是终端或控制台,print 应该自动编码 Unicode 数据以匹配您的终端或控制台配置,但这可能并不总是正确的,或者设置为可以处理您尝试打印的字符的编解码器!

请注意,我解码了。如果您编码,Python 会尝试提供帮助并首先将字节解码为 Unicode 对象,以便之后对其进行编码。因为\xa2 不是有效的 ASCII 字节,所以解码失败。

您可能想阅读:

在继续之前。

【讨论】:

    【解决方案2】:

    你可以试试:

     print "3.4" + u"\u00A2" +"each"
    

    为我工作。

    【讨论】:

    • 您不想依赖隐式转换。对整个表达式使用 Unicode 字符串。此外,您不能在同一行使用print 和赋值语句。
    • 您也没有添加任何空格。为什么不直接使用u'3.4\u00A2 each'?您可能想解释为什么您尝试的方法有效。
    【解决方案3】:

    几点:

    • encode 是一种将 unicode 字符串转换为字节的方法。如果你在一个字节串上调用encode,Python2 将首先尝试用 ASCII 对其进行解码,然后对其进行编码。这就是您的错误的来源。

    • 您的字符串无法使用 UTF-8 解码,因为并非每个字节序列都是有效的 UTF-8。

    演示:

    >>> "3.4\xa2 / each".decode('utf-8')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xa2 in position 3: invalid start byte
    
    • 您可以在此处使用 latin-1 编码,因为它将每个字节映射到相应的 unicode 序号。

    演示:

    >>> print("3.4\xa2 / each".decode('latin-1'))
    3.4¢ / each
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-22
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多