【问题标题】:Python 3 : Converting UTF-8 unicode Hindi Literal to UnicodePython 3:将 UTF-8 unicode 印地语文字转换为 Unicode
【发布时间】:2019-12-14 13:11:15
【问题描述】:

我有一串 UTF-8 文字

'\xe0\xa4\xb9\xe0\xa5\x80\xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2' 转换为

ही बोल 在印地语中。我无法将string a 转换为字节

a = '\xe0\xa4\xb9\xe0\xa5\x80 \xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2'
#convert a to bytes
#also tried a = bytes(a,'utf-8')
a = a.encode('utf-8')
s = str(a,'utf-8')

字符串转换为字节,但包含错误的 unicode 文字

结果b'\xc3\xa0\xc2\xa4\xc2\xb9\xc3\xa0\xc2\xa5\xc2\x80 \xc3\xa0\xc2\xa4\xc2\xac\xc3\xa0\xc2\xa5\xc2\x8b\xc3\xa0\xc2\xa4\xc2\xb2' 打印 - हॠबà¥à¤²

预期:应该是b'\xe0\xa4\xb9\xe0\xa5\x80\xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2,即ही बोल

【问题讨论】:

  • 你想达到什么目的?你有字节(一个 UTF-8 编码的字符串)。你想用它做什么? b'\xe0\xa4\xb9\xe0\xa5\x80 \xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2'.decode('utf8') 是你要找的吗?
  • 字节串错误,应该是b'\xe0\xa4\xb9\xe0\xa5\x80 \xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2
  • 所以你的起点是字符串“ही बोल”?如果是这样,您可能正在寻找'ही बोल'.encode('utf-8')
  • 'ही बोल 不是起点。这是 '\xe0\xa4\xb9\xe0\xa5\x80 \xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2' ही बोल 是最终预期结果
  • 我不明白。你的出发点和你的结果似乎是一样的。如果是这样,则不需要处理。如果您提供更大的上下文可能会有所帮助:数据来自哪里以及以什么格式?需要去哪里,以什么形式?

标签: python unicode utf-8 character-encoding hindi


【解决方案1】:

使用 raw-unicode-escape 编解码器将字符串编码为字节,然后您可以解码为 UTF-8。

>>> s = '\xe0\xa4\xb9\xe0\xa5\x80 \xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2'
>>> s.encode('raw-unicode-escape').decode('utf-8')
'ही बोल'

这是一种解决方法;理想的解决方案是防止数据源对原始字节进行字符串化。

【讨论】:

    【解决方案2】:

    您的原始字符串可能被解码为latin1。如果可能,将其解码为 UTF-8,但如果收到错误,您可以通过再次编码为 latin1 并正确解码为 UTF-8 来反转它:

    >>> s = '\xe0\xa4\xb9\xe0\xa5\x80 \xe0\xa4\xac\xe0\xa5\x8b\xe0\xa4\xb2'
    >>> s.encode('latin1').decode('utf8')
    'ही बोल'
    

    请注意,latin1 编码匹配前 256 个 Unicode 代码点,因此U+00E0(Python 3 中的'\xe0' str 对象)变为字节 E0h(Python 3 中的 b'\xe0'bytes 对象) .这是 U+0000-U+00FF 和字节 00h-FFh 之间的 1:1 映射。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2015-10-08
      • 2013-06-20
      • 1970-01-01
      • 2015-04-12
      相关资源
      最近更新 更多