首页 > 解决方案 > python中'\xe2\x80\x93'和'-'有什么区别?我如何将所有更改为后者?

问题描述

我在使用 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
–

我之所以要进行更改,是因为我发现“–”(en-dash)可以成功写入bigquery,而“\xe2\x80\x93”会引发上述错误。

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

谢谢。

标签: pythonpython-2.7encode

解决方案


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

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


推荐阅读