【问题标题】:What's the difference of '\xe2\x80\x93' and '-' in python? How do I change all to the latter?python中'\xe2\x80\x93'和'-'有什么区别?我如何将所有更改为后者?
【发布时间】:2019-08-20 06:45:46
【问题描述】:

我在使用 apache.beam 管道将数据写入 bigquery 时遇到错误(字段 string_value 遇到非 ASCII 字符串 '\xe2\x80\x93':'ascii' 编解码器无法解码字节 0xe2)。

我从 http 请求中获取数据,响应正文包含“\xe2\x80\x93”而不是“–”(短划线)。

问题 1: "\xe2\x80\x93" 和 "–"(en-dash) 有什么区别,而它们的打印是一样的?

>>> a='\xe2\x80\x93'
>>> a
'\xe2\x80\x93'
>>> print a
–
>>> b='–'
>>> b
'–'
>>> print b
–

问题 2: 如何将“\xe2\x80\x93”更改为“–”(短划线)?预期结果是:

>>> a='\xe2\x80\x93'
>>> (some operation to a here)
>>> a
'–'
>>> print a
–

之所以要改,是因为发现“-”(破折号)可以成功写入bigquery,而“\xe2\x80\x93”会抛出上述错误。

还有其他字符有这个问题,所以我不能只替换“\xe2\x80\x93”。

谢谢。

【问题讨论】:

  • 您的- (b) 是常规的 ASCII 连字符减号。另一个是破折号。
  • stackoverflow.com/questions/29968179/…。听起来很傻,但为什么不if a == '\xe2\x80\x93': a = '-'
  • @deceze 谢谢,但我可以将“a”更改为破折号(字符串,而不是字节)吗?
  • @SergioPulgarin 谢谢,"\xe2\x80\x93" 只是其中一种情况,其他字符可能会抛出类似的错误
  • 我明白了,然后我会说跟进我发布的答案以及他们提供的链接,并以正确的方式进行。

标签: python python-2.7 encode


【解决方案1】:

b"\xe2\x80\x93" 不是 ASCII;由于 ASCII 是 7 位,一个明显的指标是所有这些字节都设置了最高位(值 128 和更高)。它是 UTF-8,并解码为一个字符,代码点 0x2013,即en-dash。 0x2d 处的 hyphen-minus 是 ASCII 中存在的类似字符,但替换它只是一个近似值。也就是说,这样的近似值可用于例如iconv's ASCII//TRANSLIT targeticonv 不在 Python 标准库中,但在 PyPI 中作为模块提供。

听起来您知道这些应该是破折号;在这种情况下,您可能只需要一个 a.decode('UTF-8') 调用来生成正确的 unicode 字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多