将单个Unicode字符转换为ASCII字符

时间:2018-06-09 12:16:00

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

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

e.g。 prototypeArray [i] [1] = 00C4

e.g。 prototypeArray [i] [0] = A25

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

目前它只是取代例如\ A25用文本中的\ u00C4。 unicode字符不会被解释为。

1 个答案:

答案 0 :(得分:2)

UTF-8具体解释: 我假设您在UTF-8中以十六进制表示的unicode点存储为变量(c)中的字符串。而你想确定相应的角色。然后,以下代码段显示了如何执行此操作:

>>> 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在内部执行的操作。