python - 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”。
谢谢。
解决方案
b"\xe2\x80\x93"
不是ASCII;由于 ASCII 是 7 位,一个明显的指标是所有这些字节都设置了最高位(值 128 和更高)。它是 UTF-8,并解码为一个字符,代码点 0x2013,它是一个破折号。0x2d 处的连字符减号是 ASCII 中存在的类似字符,但替换它只是一个近似值。也就是说,这样的近似值在 egiconv
的ASCII//TRANSLIT
target中是可用的。iconv
不在 Python 标准库中,但在 PyPI 中作为模块提供。
听起来您知道这些应该是破折号;在这种情况下,您可能只需要一个a.decode('UTF-8')
调用来生成正确的 unicode 字符串。
推荐阅读
- node.js - mongodb查询与mysql
- amazon-web-services - 通过 route53 的 API 网关给出 403 Forbidden
- sql - 如何计算矩阵中NULL值的比例?
- laravel - Laravel 与 PhpStorm,找不到方法 findOrFail
- analytics - 类别占 Cognos 表达式构建器总数的百分比
- charts - 如何在 Charts 框架或任何其他框架替代方案的帮助下使用 SwiftUI 在 Widget 上绘制图表?
- visual-studio - FTPS ClickOnce 在 Visual Studio 2019 中发布
- python - Plotly Express 等值线图未显示在 Visual Studio 代码中
- anychart - 使用 React 的 Anychart 绘图和注释
- c# - 根据消息元数据过滤 ServiceBusTrigger 消息