如何解码 b"\x95\xc3\x8a\xb0\x8ds\x86\x89\x94\x82\x8a\xba"?

Nao*_* Hu 7 python character-encoding cjk

[摘要]:\n从文件中抓取的数据是

\n
b"\\x95\\xc3\\x8a\\xb0\\x8ds\\x86\\x89\\x94\\x82\\x8a\\xba"\n
Run Code Online (Sandbox Code Playgroud)\n

请问如何将这些字节解码为可读的汉字?

\n

======

\n

我从 exe 文件中提取了一些游戏脚本。该文件是用 Enigma Virtual Box 打包的,我将其解压。

\n

然后我就能看到脚本的正确名称,英文名称,正如它应该的那样。

\n

在分析这些脚本时,我收到如下错误:

\n
UnicodeDecodeError: \'utf-8\' codec can\'t decode byte 0x95 in position 0: invalid start byte\n
Run Code Online (Sandbox Code Playgroud)\n

我把解码改成GBK,错误就消失了。

\n

但输出文件不可读。它包括可读的英文字符和不可读的中文内容。例子:

\n
\n

chT0002>pDI\xd3\x98I\xca\x86

\n
\n

我尝试了不同的编码来保存文件,但它们显示相同的结果,因此问题可能出在解码部分。

\n

从文件中抓取的数据是

\n
b"\\x95\\xc3\\x8a\\xb0\\x8ds\\x86\\x89\\x94\\x82\\x8a\\xba"\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试了很多方法,但无法将这些字节解码为可读的汉字。文件本身有问题吗?或者别的地方?我真的需要帮助,拜托。

\n

此处附有其中一份脚本。

\n

Sam*_*gan 6

为了可靠地解码字节,您必须知道字节是如何编码的。我将借用 python 文档中的引用codecs

\n
\n

如果没有外部信息,则无法可靠地确定使用哪种编码来对字符串进行编码。

\n
\n

如果没有这些信息,有一些方法可以尝试检测编码(chardet似乎是最广泛使用的)。以下是您可以采取的方法。

\n
import chardet\n\ndata = b"\\x95\\xc3\\x8a\\xb0\\x8ds\\x86\\x89\\x94\\x82\\x8a\\xba"\ndetected = chardet.detect(data)\ndecoded = data.decode(detected["encoding"])\n
Run Code Online (Sandbox Code Playgroud)\n

但是,上面的示例在这种情况下不起作用,因为chardet无法检测这些字节的编码。那时,您必须使用反复试验或尝试其他库。

\n

您可以使用的一种方法是简单地尝试每种标准编码,打印出结果,然后查看哪种编码有意义。

\n
codecs = [\n    "ascii", "big5", "big5hkscs", "cp037", "cp273", "cp424", "cp437", "cp500", "cp720", \n    "cp737", "cp775", "cp850", "cp852", "cp855", "cp856", "cp857", "cp858", "cp860",\n    "cp861", "cp862", "cp863", "cp864", "cp865", "cp866", "cp869", "cp874", "cp875",\n    "cp932", "cp949", "cp950", "cp1006", "cp1026", "cp1125", "cp1140", "cp1250",\n    "cp1251", "cp1252", "cp1253", "cp1254", "cp1255", "cp1256", "cp1257",\n    "cp1258", "cp65001", "euc_jp", "euc_jis_2004", "euc_jisx0213", "euc_kr", "gb2312",\n    "gbk", "gb18030", "hz", "iso2022_jp", "iso2022_jp_1", "iso2022_jp_2",\n    "iso2022_jp_2004", "iso2022_jp_3", "iso2022_jp_ext", "iso2022_kr", "latin_1",\n    "iso8859_2", "iso8859_3", "iso8859_4", "iso8859_5", "iso8859_6", "iso8859_7",\n    "iso8859_8", "iso8859_9", "iso8859_10", "iso8859_11", "iso8859_13", "iso8859_14",\n    "iso8859_15", "iso8859_16", "johab", "koi8_r", "koi8_t", "koi8_u", "kz1048",\n    "mac_cyrillic", "mac_greek", "mac_iceland", "mac_latin2", "mac_roman",\n    "mac_turkish", "ptcp154", "shift_jis", "shift_jis_2004", "shift_jisx0213",\n    "utf_32", "utf_32_be", "utf_32_le", "utf_16", "utf_16_be", "utf_16_le", "utf_7",\n    "utf_8", "utf_8_sig",\n]\n\ndata = b"\\x95\\xc3\\x8a\\xb0\\x8ds\\x86\\x89\\x94\\x82\\x8a\\xba"\n\nfor codec in codecs:\n    try:\n        print(f"{codec}, {data.decode(codec)}")\n    except UnicodeDecodeError:\n        continue\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
cp037, nC\xc2\xab^\xc3\xbd\xc3\x8bfimb\xc2\xab[\ncp273, nC\xc2\xab\xc2\xa2\xc3\xbd\xc3\x8bfimb\xc2\xab\xc2\xac\ncp437, \xc3\xb2\xe2\x94\x9c\xc3\xa8\xe2\x96\x91\xc3\xacs\xc3\xa5\xc3\xab\xc3\xb6\xc3\xa9\xc3\xa8\xe2\x95\x91\ncp500, nC\xc2\xab\xc2\xa2\xc3\xbd\xc3\x8bfimb\xc2\xab\xc2\xac\ncp720, \xd9\x80\xe2\x94\x9c\xc3\xa8\xe2\x96\x91s\xc3\xab\xc2\xa4\xc3\xa9\xc3\xa8\xe2\x95\x91\ncp737, \xce\xa7\xe2\x94\x9c\xce\x9b\xe2\x96\x91\xce\x9es\xce\x97\xce\x9a\xce\xa6\xce\x93\xce\x9b\xe2\x95\x91\ncp775, \xc4\xa2\xe2\x94\x9c\xc5\x96\xe2\x96\x91\xc5\xb9s\xc3\xa5\xc4\x93\xc3\xb6\xc3\xa9\xc5\x96\xe2\x95\x91\ncp850, \xc3\xb2\xe2\x94\x9c\xc3\xa8\xe2\x96\x91\xc3\xacs\xc3\xa5\xc3\xab\xc3\xb6\xc3\xa9\xc3\xa8\xe2\x95\x91\ncp852, \xc4\xbd\xe2\x94\x9c\xc5\x90\xe2\x96\x91\xc5\xb9s\xc4\x87\xc3\xab\xc3\xb6\xc3\xa9\xc5\x90\xe2\x95\x91\ncp855, \xd0\x8b\xe2\x94\x9c\xd1\x96\xe2\x96\x91\xd0\x87s\xd1\x94\xd0\x85\xd1\x9b\xd1\x93\xd1\x96\xe2\x95\x91\ncp856, \xd7\xa5\xe2\x94\x9c\xd7\x9a\xe2\x96\x91\xd7\x9ds\xd7\x96\xd7\x99\xd7\xa4\xd7\x92\xd7\x9a\xe2\x95\x91\ncp857, \xc3\xb2\xe2\x94\x9c\xc3\xa8\xe2\x96\x91\xc4\xb1s\xc3\xa5\xc3\xab\xc3\xb6\xc3\xa9\xc3\xa8\xe2\x95\x91\ncp858, \xc3\xb2\xe2\x94\x9c\xc3\xa8\xe2\x96\x91\xc3\xacs\xc3\xa5\xc3\xab\xc3\xb6\xc3\xa9\xc3\xa8\xe2\x95\x91\ncp860, \xc3\xb2\xe2\x94\x9c\xc3\xa8\xe2\x96\x91\xc3\xacs\xc3\x81\xc3\x8a\xc3\xb5\xc3\xa9\xc3\xa8\xe2\x95\x91\ncp861, \xc3\xbe\xe2\x94\x9c\xc3\xa8\xe2\x96\x91\xc3\x9es\xc3\xa5\xc3\xab\xc3\xb6\xc3\xa9\xc3\xa8\xe2\x95\x91\ncp862, \xd7\xa5\xe2\x94\x9c\xd7\x9a\xe2\x96\x91\xd7\x9ds\xd7\x96\xd7\x99\xd7\xa4\xd7\x92\xd7\x9a\xe2\x95\x91\ncp863, \xc3\x8f\xe2\x94\x9c\xc3\xa8\xe2\x96\x91\xe2\x80\x97s\xc2\xb6\xc3\xab\xc3\x8b\xc3\xa9\xc3\xa8\xe2\x95\x91\ncp864, \xc2\xbc\xef\xba\x83\xe2\x94\x9c\xd9\xa0\xe2\x94\x8cs\xe2\x94\x82\xe2\x94\xac\xc2\xbd\xe2\x88\x99\xe2\x94\x9c\xef\xbb\x91\ncp865, \xc3\xb2\xe2\x94\x9c\xc3\xa8\xe2\x96\x91\xc3\xacs\xc3\xa5\xc3\xab\xc3\xb6\xc3\xa9\xc3\xa8\xe2\x95\x91\ncp866, \xd0\xa5\xe2\x94\x9c\xd0\x9a\xe2\x96\x91\xd0\x9ds\xd0\x96\xd0\x99\xd0\xa4\xd0\x92\xd0\x9a\xe2\x95\x91\ncp875, nC\xce\xb1\xc2\xa3\xce\xb4\xce\x89fimb\xce\xb1\xcf\x82\ncp949, \xeb\xb9\xa9\xeb\x92\xba\xeb\x9b\xb1\xeb\x83\xb9\xeb\xb4\xbb\xeb\x93\x86\ncp1006, \xef\xba\xa3\xef\xba\x8ds\xef\xad\xa6\ncp1026, nC\xc2\xab\xc2\xa2`\xc3\x8bfimb\xc2\xab\xc2\xac\ncp1125, \xd0\xa5\xe2\x94\x9c\xd0\x9a\xe2\x96\x91\xd0\x9ds\xd0\x96\xd0\x99\xd0\xa4\xd0\x92\xd0\x9a\xe2\x95\x91\ncp1140, nC\xc2\xab^\xc3\xbd\xc3\x8bfimb\xc2\xab[\ncp1250, \xe2\x80\xa2\xc4\x82\xc5\xa0\xc2\xb0\xc5\xa4s\xe2\x80\xa0\xe2\x80\xb0\xe2\x80\x9d\xe2\x80\x9a\xc5\xa0\xc5\x9f\ncp1251, \xe2\x80\xa2\xd0\x93\xd0\x89\xc2\xb0\xd0\x8cs\xe2\x80\xa0\xe2\x80\xb0\xe2\x80\x9d\xe2\x80\x9a\xd0\x89\xd1\x94\ncp1256, \xe2\x80\xa2\xd8\xa3\xd9\xb9\xc2\xb0\xda\x86s\xe2\x80\xa0\xe2\x80\xb0\xe2\x80\x9d\xe2\x80\x9a\xd9\xb9\xd8\x9b\ngbk, \xe6\x9a\xb6\xe5\xa7\xb2\xe5\xb3\xb4\xe5\x94\xb9\xe6\x94\xa4\xe5\xa7\xbe\ngb18030, \xe6\x9a\xb6\xe5\xa7\xb2\xe5\xb3\xb4\xe5\x94\xb9\xe6\x94\xa4\xe5\xa7\xbe\nlatin_1, \xc3\x83\xc2\xb0s\xc2\xba\niso8859_2, \xc4\x82\xc2\xb0s\xc5\x9f\niso8859_4, \xc3\x83\xc2\xb0s\xc4\x93\niso8859_5, \xd0\xa3\xd0\x90s\xd0\x9a\niso8859_7, \xce\x93\xc2\xb0s\xce\x8a\niso8859_9, \xc3\x83\xc2\xb0s\xc2\xba\niso8859_10, \xc3\x83\xc2\xb0s\xc5\xa1\niso8859_11, \xe0\xb8\xa3\xe0\xb8\x90s\xe0\xb8\x9a\niso8859_13, \xc4\x86\xc2\xb0s\xc5\x97\niso8859_14, \xc3\x83\xe1\xb8\x9es\xe1\xba\x83\niso8859_15, \xc3\x83\xc2\xb0s\xc2\xba\niso8859_16, \xc4\x82\xc2\xb0s\xc8\x99\nkoi8_r, \xe2\x88\x99\xd1\x86\xe2\x94\xbc\xe2\x95\x9f\xe2\x96\x88s\xe2\x94\x9c\xe2\x94\xb4\xe2\x96\xa0\xe2\x94\x8c\xe2\x94\xbc\xe2\x95\xa8\nkoi8_u, \xe2\x88\x99\xd1\x86\xe2\x94\xbc\xe2\x95\x9f\xe2\x96\x88s\xe2\x94\x9c\xe2\x94\xb4\xe2\x96\xa0\xe2\x94\x8c\xe2\x94\xbc\xe2\x95\xa8\nkz1048, \xe2\x80\xa2\xd0\x93\xd0\x89\xc2\xb0\xd2\x9as\xe2\x80\xa0\xe2\x80\xb0\xe2\x80\x9d\xe2\x80\x9a\xd0\x89\xd2\x93\nmac_cyrillic, \xd0\xa5\xe2\x88\x9a\xd0\x9a\xe2\x88\x9e\xd0\x9ds\xd0\x96\xd0\x99\xd0\xa4\xd0\x92\xd0\x9a\xd0\x87\nmac_greek, \xc3\xaf\xce\x9f\xc3\xa4\xce\x91\xc3\xa7s\xc3\x9c\xc3\xa2\xc3\xae\xc2\xb2\xc3\xa4\xce\x9a\nmac_iceland, \xc3\xaf\xe2\x88\x9a\xc3\xa4\xe2\x88\x9e\xc3\xa7s\xc3\x9c\xc3\xa2\xc3\xae\xc3\x87\xc3\xa4\xe2\x88\xab\nmac_latin2, \xc4\x93\xe2\x88\x9a\xc3\xa4\xc4\xaf\xc4\x87s\xc3\x9c\xc4\x8c\xc4\x92\xc4\x81\xc3\xa4\xc4\xbc\nmac_roman, \xc3\xaf\xe2\x88\x9a\xc3\xa4\xe2\x88\x9e\xc3\xa7s\xc3\x9c\xc3\xa2\xc3\xae\xc3\x87\xc3\xa4\xe2\x88\xab\nmac_turkish, \xc3\xaf\xe2\x88\x9a\xc3\xa4\xe2\x88\x9e\xc3\xa7s\xc3\x9c\xc3\xa2\xc3\xae\xc3\x87\xc3\xa4\xe2\x88\xab\nptcp154, \xe2\x80\xa2\xd0\x93\xd2\xa0\xc2\xb0\xd2\x9as\xd2\xb6\xd2\xaf\xe2\x80\x9d\xd3\xae\xd2\xa0\xd3\x99\nshift_jis_2004, \xe9\x99\x9b\xe5\xaf\x9b\xe8\xa1\x8c\xcc\xb9\xe7\x8b\xbd\xe6\xa1\x93\nshift_jisx0213, \xe9\x99\x9b\xe5\xaf\x9b\xe8\xa1\x8c\xcc\xb9\xe7\x8b\xbd\xe6\xa1\x93\nutf_16, \xec\x8e\x95\xeb\x82\x8a\xe7\x8e\x8d\xe8\xa6\x86\xe8\x8a\x94\xeb\xaa\x8a\nutf_16_be, \xe9\x97\x83\xe8\xaa\xb0\xe8\xb5\xb3\xe8\x9a\x89\xe9\x92\x82\xe8\xaa\xba\nutf_16_le, \xec\x8e\x95\xeb\x82\x8a\xe7\x8e\x8d\xe8\xa6\x86\xe8\x8a\x94\xeb\xaa\x8a\n
Run Code Online (Sandbox Code Playgroud)\n

编辑:通过 Google Translate 运行所有看似清晰的结果后,我怀疑此编码是 UTF-16 big-endian。这是结果:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
编码已解码检测到语言英文翻译
国标\xe6\x9a\xb6\xe5\xa7\xb2\xe5\xb3\xb4\xe5\x94\xb9\xe6\x94\xa4\xe5\xa7\xbe中国人尖线角摊角
国标18030\xe6\x9a\xb6\xe5\xa7\xb2\xe5\xb3\xb4\xe5\x94\xb9\xe6\x94\xa4\xe5\xa7\xbe中国人尖线角探角
utf_16\xec\x8e\x95\xeb\x82\x8a\xe7\x8e\x8d\xe8\xa6\x86\xe8\x8a\x94\xeb\xaa\x8a韩国人没有任何
utf_16_be\xe9\x97\x83\xe8\xaa\xb0\xe8\xb5\xb3\xe8\x9a\x89\xe9\x92\x82\xe8\xaa\xba中国人骨骺是谁?
utf_16_le\xec\x8e\x95\xeb\x82\x8a\xe7\x8e\x8d\xe8\xa6\x86\xe8\x8a\x94\xeb\xaa\x8a韩国人没有任何
\n