【问题标题】:map unicode value (without \u) to to proper string decoded [duplicate]将 unicode 值(不带 \u)映射到正确解码的字符串 [重复]
【发布时间】:2019-08-01 00:57:54
【问题描述】:

我有一个字符串序列,它们通常是字符串的 Unicode 值,开头没有 \u。 例如: 00330034 相当于 \u0033\u0034 导致 34。

问题是将这种序列(如 003300340035....)转换为它们在 python 中的正确值的最佳解决方案是什么。

提前致谢

【问题讨论】:

  • 在字符串00330034 中拆分文本并使用chr() ?
  • 忽略可变长度编码@furas
  • @BradSolomon 这似乎是一个不合理的问题,因为这个问题专门处理四个十六进制数字的固定长度字符串。
  • bytes.fromhex(s).decode('utf_16_be') 应该可以解决问题
  • @georg 谢谢你的工作。真的很感激。

标签: python python-3.x unicode


【解决方案1】:

这里是用户的单行版本:Green Cloak Guy的回答

>>> s = '00330034'
>>> print (int(''.join(chr(int(x, 16)) for x in map(''.join, zip(*[iter(s)]*4)))))
34

【讨论】:

  • 这是iter() 的一个非常有创意的用法——我从来没有意识到你可以这样使用它。我想我今天学到了一些东西!
【解决方案2】:
# function to split an iterable into evenly-sized chunks
def chunk(iterable, size):
    idx = 0
    while idx < len(iterable):
        yield iterable[idx:idx+size]
        idx += size

# define the original string
orig_string = "003300340035"
# convert to string of codepoints
unicode_str = "".join(chr(int(codepoint, 16)) for codepoint in chunk(orig_string, 4))

print(unicode_str)
# 345

最后一行有几个步骤。澄清:

  1. 将原始字符串分成 4 个字符的块并对其进行迭代 (for codepoint in chunk(orig_string, 4))
  2. 将每个四字符字符串转换为整数,假设它是 base-16 (int(codepoint, 16))
  3. 获取具有给定整数代码点 (chr()) 的 unicode 字符
  4. 将所有单独的 unicode 字符重新组合成一个字符串 ("".join())

只有当您的代码是专有 4 字符 unicode 代码点时,它也才有效。但是检测这些东西,如果它们混合在一起,是一个单独问题的单独问题。

【讨论】:

  • 这比您想象的要复杂一些,请尝试使用例如D83DDE00
  • 这将中断任何高于 65536 的代码点
  • @georg 处理无效的 Unicode 应该是从任何调用代码中捕获异常的简单问题。但在这种情况下,Python 似乎可以应付得很好 - 它只是垃圾输入,垃圾输出。
  • @tripleee:问题是,D83DDE00 是完全有效的 unicode(确切地说是 UTF-16)。
  • @georg 这是一个有效的问题,但我认为它超出了所问问题的范围。我不知道如何检测特定字节是否是 UTF-16 代码点的前半部分,但只要有任何模式,您就可以通过将列表理解扩展到正确的 for 循环并使用进位来解决问题变量或其他东西(即“假设代码点是 4 个字符,除非那将是无效的,在这种情况下将下一个代码点附加到它并使用 that”)。
猜你喜欢
  • 2011-11-27
  • 2019-08-08
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2018-07-09
  • 1970-01-01
相关资源
最近更新 更多