如何解码 python 中的部分转义 unicode 字符串(混合 unicode 和转义 unicode)?
How to decode partially escaped unicode string in python (mixed unicode and escaped unicode)?
给定以下字符串:
str = "\u20ac €"
如何解码成€ €
?
使用 str.encode("utf-8").decode("unicode-escape")
returns € â\x82¬
(澄清一下,我正在寻找一个通用的解决方案来解码 unicode 和转义字符的任何组合)
如果这始终是字符串的格式,请使用 .split
:
string = "\u20ac €"
escaped_unicode, non_escaped_unicode = string.split()
output = '{} {}'.format(escaped_unicode.encode("utf-8").decode("unicode-escape"), non_escaped_unicode)
print(output)
# € €
否则,我们需要发挥更多创意。我认为最通用的解决方案是仍然使用 split
,但随后使用正则表达式来确定我们是否需要处理转义的 unicode( 假设输入足够健全,不会混合 unicode 和转义的 unicode在同一个“单词”中)
import re
string = "ac ab \u20ac cdef €"
regex = re.compile(r'([\u0000-\u007F]+)')
output = []
for word in string.split():
match = regex.search(word)
if match:
try:
output.append(match[0].encode("utf-8").decode("unicode-escape"))
except UnicodeDecodeError:
# assuming the string contained a literal \u or anything else
# that decode("unicode-escape") could not handle, so adding to output as is
output.append(word)
else:
output.append(word)
print(' '.join(output))
# ac ab € cdef €
一个简单快速的解决方案是使用re.sub
匹配\u
和恰好四个十六进制数字,并将这些数字转换为Unicode代码点:
import re
s = r"blah bl\uah \u20ac € b\u20aclah\u12blah blah"
print(s)
s = re.sub(r'\u([0-9a-fA-F]{4})',lambda m: chr(int(m.group(1),16)),s)
print(s)
输出:
blah bl\uah \u20ac € b\u20aclah\u12blah blah
blah bl\uah € € b€lah\u12blah blah
给定以下字符串:
str = "\u20ac €"
如何解码成€ €
?
使用 str.encode("utf-8").decode("unicode-escape")
returns € â\x82¬
(澄清一下,我正在寻找一个通用的解决方案来解码 unicode 和转义字符的任何组合)
如果这始终是字符串的格式,请使用 .split
:
string = "\u20ac €"
escaped_unicode, non_escaped_unicode = string.split()
output = '{} {}'.format(escaped_unicode.encode("utf-8").decode("unicode-escape"), non_escaped_unicode)
print(output)
# € €
否则,我们需要发挥更多创意。我认为最通用的解决方案是仍然使用 split
,但随后使用正则表达式来确定我们是否需要处理转义的 unicode( 假设输入足够健全,不会混合 unicode 和转义的 unicode在同一个“单词”中)
import re
string = "ac ab \u20ac cdef €"
regex = re.compile(r'([\u0000-\u007F]+)')
output = []
for word in string.split():
match = regex.search(word)
if match:
try:
output.append(match[0].encode("utf-8").decode("unicode-escape"))
except UnicodeDecodeError:
# assuming the string contained a literal \u or anything else
# that decode("unicode-escape") could not handle, so adding to output as is
output.append(word)
else:
output.append(word)
print(' '.join(output))
# ac ab € cdef €
一个简单快速的解决方案是使用re.sub
匹配\u
和恰好四个十六进制数字,并将这些数字转换为Unicode代码点:
import re
s = r"blah bl\uah \u20ac € b\u20aclah\u12blah blah"
print(s)
s = re.sub(r'\u([0-9a-fA-F]{4})',lambda m: chr(int(m.group(1),16)),s)
print(s)
输出:
blah bl\uah \u20ac € b\u20aclah\u12blah blah
blah bl\uah € € b€lah\u12blah blah