将 "literal" unicode 字符转换为等效字符而不强调

Converting "literal" unicode character to an equivalent without emphasising

我输入了一个包含“文字”unicode 字符的字符串。

"I want to replace \u00c6 with AE and \u00d5 with O"

注意: \u00c6 = Æ \u00d5 = Ö

因此,使用我的 python 脚本,我可以轻松替换一个字符:

>>> print("I want to replace \u00c6 with AE and \u00d5 with O".replace(u"\u00c6","AE"))
I want to replace AE with AE and Õ with O

但是如果我想全部替换怎么办? (示例中只有2个,但我们可以想象我们必须搜索50个字符才能替换。

我试过用字典来匹配,但是好像不行

#input  : "\u00c0 \u00c1 \u00c2 \u00d2 \u00c4 \u00c5 \u00c6 \u00d6"
#output (expected) : "A A A O A A AE 0"

import sys

unicode_table = {
   '\u00c0': 'A',  #À
   '\u00c1': 'A',  #Á
   '\u00c2': 'A',  #Â
   '\u00c3': 'A',  #Ã
   '\u00c4': 'A',  #Ä
   '\u00c5': 'A',  #Å
   '\u00c6': 'AE', #Æ
   '\u00d2': 'O',  #Ò
   '\u00d3': 'O',  #Ó
   '\u00d4': 'O',  #Ô
   '\u00d5': 'O',  #Õ
   '\u00d6': 'O'   #Ö
   #this may go on much further
}

result = sys.argv[1]

for key in unicode_table:
   #print(key + unicode_table[key])
   result = result.replace(key,unicode_table[key])

print(result)

输出:

[puppet@damageinc python]$ python replace_unicode.py "\u00c0 \u00c1 \u00c2 \u00d2 \u00c4 \u00c5 \u00c6 \u00d6"
\u00c0 \u00c1 \u00c2 \u00d2 \u00c4 \u00c5 \u00c6 \u00d6

感谢任何帮助! 谢谢。

编辑:两个带有评论的解决方案,谢谢

1st:用 unicode_escape 重新编码字符串:

result = sys.argv[1].encode().decode('unicode_escape')

第二:使用模块unidecode,只是为了避免重新发现轮子

import sys
from unidecode import unidecode

result = sys.argv[1].encode().decode('unicode_escape')
print(unidecode(result))

您的 Python 代码按预期工作,是您的 shell 没有呈现转义序列,即 Python 脚本按字面意思接收“\u00c0”而不是“À” "等

您应该尝试使用一些实际的 unicode 字符串对其进行测试,或者通过添加例如调整您的命令printfecho -e 在将转义序列传递给脚本之前呈现转义序列:

python replace_unicode.py "$(printf '\u00c0 ... \u00d6')"