解码十六进制UTF-8字符
我遇到了一个Apache产生的错误代码:
\xed\xe5 \xff\xb\xff\xe5\xf2\xf1\xff \xef\xf0\xe8\xeb\xee\xe6\xe5\xed\xe8\xe5\xec
我发现\x
这个转义序列表示后面的两个字符是UTF的十六进制符号。比如,单词HELLO
可以被编码成\x48\x45\x4C\x4C\x4F
。但是我不知道怎么解码我手上的这个字符串。
我查过UTF编码表,但没有找到和我有的编码符号匹配的字符。我甚至不知道我应该找一个字节的编码还是两个字节的编码。
我使用的是设置为俄语的电脑,不知道这是否有帮助。
2 个回答
3
使用 unicode-escape
和 string-escape
编码:
>>> r'\x48\x45\x4C\x4C\x4F'.decode('unicode-escape')
u'HELLO'
>>> r'\x48\x45\x4C\x4C\x4F'.decode('string-escape')
'HELLO'
5
看起来你的字符串是用cp-1251编码的:
s.decode('string_escape').decode('cp1251')
打印出一些看起来有意义的东西(除了\xb
可能是错误的 - 可能是复制粘贴时出错了?):
s = r'\xed\xe5 \xff?xb\xff\xe5\xf2\xf1\xff \xef\xf0\xe8\xeb\xee\xe6\xe5\xed\xe8\xe5\xec'
s = s.decode('string_escape').decode('cp1251')
#не я?xbяется приложением
我甚至不知道我应该寻找一个字节还是两个字节的编码。
这时候chardet就能帮上忙了:
import chardet
s = r'\xed\xe5 \xff?xb\xff\xe5\xf2\xf1\xff \xef\xf0\xe8\xeb\xee\xe6\xe5\xed\xe8\xe5\xec'
print chardet.detect(s.decode('string_escape'))
# {'confidence': 0.99, 'encoding': 'windows-1251'}
如果你不懂python,也可以用javascript,比如http://jsfiddle.net/L3Z4b/