解码十六进制UTF-8字符

2 投票
2 回答
3038 浏览
提问于 2025-04-18 10:04

我遇到了一个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-escapestring-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/

撰写回答