【问题标题】:Convert single Unicode character to ASCII character将单个 Unicode 字符转换为 ASCII 字符
【发布时间】:2018-11-19 07:33:33
【问题描述】:

我有一个 unicode,例如“00C4”保存在一个数组中。我想替换一个占位符,例如文本中的“\A25”,其中包含仅具有 unicode 值的数组中的 unicode 的 ascii 值。我尝试了所有的编码、解码、原始字符串、unicode 字符串和带有转义符号“\”的不同设置。这里的问题是我不能在代码中写清楚的'\u1234',我必须使用数组值并将它与'\u'之类的东西结合起来。这是我当前的代码:

例如原型数组[i][1] = 00C4

例如原型数组[i][0] = A25

unicodeChar = u'\\u' + prototypeArray[i][1]
placeholder = '\\' + prototypeArray[i][0]
placeholder = u'' + placeholder
text = text.replace(placeholder,s)

目前它只是替换例如\A25 和 \u00C4 在文本中。 unicode 字符不会被这样解释。

【问题讨论】:

  • 我认为您的意思是“Unicode 代码点”而不是“Unicode”。 ASCII 是 Unicode 编码的子集。 unicode 代码点并不总是有 ASCII 值。对于 U+007F 以上的 Unicode 点,您使用哪种编码方案? UTF-8?
  • 是的,你是对的。我有一个 unicode 代码点并想将其转换为相关字符。 unicode 代码点仅保存为数组中没有 \u 的数字/字符串。然后我想在数字前面添加 \u,以便将字符解释为实际字符。编码为utf-8。

标签: regex python-3.x unicode type-conversion ascii


【解决方案1】:

UTF-8 具体解释: 我假设您在 UTF-8 中以十六进制表示的 unicode 点作为字符串存储在变量 (c) 中。而你要确定对应的字符。然后下面的代码 sn -p 展示了怎么做:

>>> import binascii
>>> cp2chr = lambda c: binascii.unhexlify(c.zfill(len(c) + (len(c) & 1))).decode('utf-8')
>>> cp2chr('C484')
'Ą'

解释:如果字符数是奇数,zfill 会在前面加上一个零。 binascii.unhexlify 基本上每个需要两个字符,将它们解释为十六进制数字并将它们变成一个字节。所有这些字节都合并到一个字节数组中。最后str.decode('utf-8') 将这些字节解释为 UTF-8 编码数据并将其作为字符串返回。

>>> cp2chr('00C4')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 1: unexpected end of data

但是,您提供的示例不是有效的 UTF-8 数据。请参阅Wikipedia's UTF-8 byte structure table 以识别有效的字节序列。 C4 具有位结构11000100,因此是一个连续字节,之后需要另一个字符。

编码独立解释: 因此,您可能正在寻找独立于编码的 unicode 点的解释。然后你正在寻找raw_unicode_escape 编码:

>>> cp2chr = lambda c: (b'\\u' + c.encode('ascii')).decode('raw_unicode_escape') 
>>> cp2chr('00C4')
'Ä'

解释: raw_unicode_escape 转换字节字符串中给出的 unicode 转义序列并将其作为字符串返回:b'\\u00C4'.decode('raw_unicode_escape') 给出Ä。如果您在源代码中编写 \uSOMETHING,这就是 python 在内部执行的操作。

【讨论】:

  • 非常感谢您的详细解释。这正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2018-11-18
  • 2018-03-21
  • 2015-03-29
  • 2013-01-26
  • 2010-12-09
相关资源
最近更新 更多