Unicode 在Python3.x中使用混合编码的字符串

Unicode 在Python3.x中使用混合编码的字符串,unicode,python-3.x,string-parsing,Unicode,Python 3.x,String Parsing,我正在使用一个二进制文件,该文件使用绝对路径引用另一个文件。 路径包含日语和ascii字符 字符串的长度是给定的,所以我可以读取那么多字节并将其转换为字符串 但是,问题是试图转换字符串。如果我将编码指定为ascii,它将在日文字符上失败。如果我将其指定为日文编码(shift-jis或其他),它将无法正确读取英文字符 每个ascii字符使用一个字节,而每个日语字符使用两个字节 将这些字节转换成字符串的最快、最干净的方法是什么?编码是已知的。同样的技术会在python的旧版本中工作吗。这听起来像是你

我正在使用一个二进制文件,该文件使用绝对路径引用另一个文件。 路径包含日语和ascii字符

字符串的长度是给定的,所以我可以读取那么多字节并将其转换为字符串

但是,问题是试图转换字符串。如果我将编码指定为ascii,它将在日文字符上失败。如果我将其指定为日文编码(shift-jis或其他),它将无法正确读取英文字符

每个ascii字符使用一个字节,而每个日语字符使用两个字节


将这些字节转换成字符串的最快、最干净的方法是什么?编码是已知的。同样的技术会在python的旧版本中工作吗。

这听起来像是你误解了Unicode和编码的基础知识。也许你没有,但误解是常见的和可以理解的,而你描述的情况却不是

根据定义,包含混合编码的字节字符串在任何这些编码中都是无效的。如果真是这样的话,您必须将字节字符串拆分为各个部分,并分别对每个部分进行解码。在这种情况下,这可能意味着在路径分隔符上进行拆分,因此这相当容易,但在其他情况下则不然。然而,我非常怀疑这种情况,因为这意味着你的消息来源是疯狂的。这种情况会发生,但不太可能发生。:-)

如果源以字节字符串的形式为您提供一条路径,则该字符串很可能只使用一种编码它可能同时包含日语和ASCII字符,并且仍然使用一种编码。可以同时处理日语和ASCII的最常见编码是UTF-8和UTF-16。我猜你的消息来源使用了其中之一。事实上,因为您写的是“每个ascii字符使用一个字节,而每个日语字符使用两个字节”,所以可能是UTF-8。它也可以是Shift-JIS,但似乎您已经尝试过了


如果没有,请解释您的源代码,并举例说明您收到的字节字符串(ASCII/十六进制)。

这听起来像是您误解了Unicode和编码的基础知识。也许你没有,但误解是常见的和可以理解的,而你描述的情况却不是

根据定义,包含混合编码的字节字符串在任何这些编码中都是无效的。如果真是这样的话,您必须将字节字符串拆分为各个部分,并分别对每个部分进行解码。在这种情况下,这可能意味着在路径分隔符上进行拆分,因此这相当容易,但在其他情况下则不然。然而,我非常怀疑这种情况,因为这意味着你的消息来源是疯狂的。这种情况会发生,但不太可能发生。:-)

如果源以字节字符串的形式为您提供一条路径,则该字符串很可能只使用一种编码它可能同时包含日语和ASCII字符,并且仍然使用一种编码。可以同时处理日语和ASCII的最常见编码是UTF-8和UTF-16。我猜你的消息来源使用了其中之一。事实上,因为您写的是“每个ascii字符使用一个字节,而每个日语字符使用两个字节”,所以可能是UTF-8。它也可以是Shift-JIS,但似乎您已经尝试过了


如果没有,请解释您的源代码,并给出所给字节字符串(ASCII/HEX)的示例。

不要混合编码;所有的东西都使用utf-8。如果我阅读的源代码不是所有的东西都使用utf-8,那就行不通了。与我一起工作的许多其他文件的开发人员也不使用utf-8(无论是中文、日文还是韩文)。使用mybytestring.decode('shift-jis')不起作用吗?shift jis在理论上与ascii兼容,除了可能的\和~字符,即使它不是真正的标准;所有的东西都使用utf-8。如果我阅读的源代码不是所有的东西都使用utf-8,那就行不通了。与我一起工作的许多其他文件的开发人员也不使用utf-8(无论是中文、日文还是韩文)。使用mybytestring.decode('shift-jis')不起作用吗?shift jis在理论上与ascii兼容,但不适用于\和~字符,即使它不是真正的标准。