我想要一个字符串的ASCII表示形式,该字符串可以包含非ASCII字符,例如德语变音符号。非ASCII字符的编码方式应作为Unicode代码点,例如ß
将是\u00df
。
问题是我的数据库中有那些转义序列。它的显示方式与我想要的一样,但是当用户搜索内容时,他输入的是ß
,而不是\u00df
。对于ß
,我可以简单地制作search_query.replace('ß', r'\u00df')
,但是有(许多)更多可能的转义序列。
>>> name = 'Ein Spaß'
>>> name.encode('ascii', 'backslashreplace')
b'Ein Spa\\xdf'
>>> name.encode('ascii', 'xmlcharrefreplace')
b'Ein Spaß'
我想要得到什么:
'Ein Spa\\u00df'
答案 0 :(得分:0)
作为一种愚蠢的解决方法,stdlib json
编码将使用4位unicode转义符:
>>> name = 'Ein Spaß'
>>> json.dumps(name)
'"Ein Spa\\u00df"'
>>> ast.literal_eval(json.dumps(name)) == name
True
但是,这并不能真正有效地解决您的搜索问题。搜索之前,您需要规范化查询文本。而且,您也想在进入数据库的路上标准化unicode数据-或使用db + ORM来为您处理此类详细信息。
有关this answer的详细信息,请参见unicodedata.normalize
。
答案 1 :(得分:0)
在可能的情况下以ascii编码 否则用代码点替换为unicode字符串 ord:是一个将字符代码点作为整数基数10的函数
new=[]
for e in name:
try:
new.append(e.encode("ascii").decode())
except:
new.append(u"\\u%04x"%ord(e))
"".join(new)
答案 2 :(得分:0)
如果数据库中的数据存储为转义的unicode,则可以使用codecs.decode
并将编码设置为unicode_escape
:
>>> name = "Ein Spa\\u00df"
>>> codecs.decode(name, "unicode_escape")
'Ein Spaß'