【问题标题】:Working with strings with mixed encodings in python 3.x在 python 3.x 中使用混合编码的字符串
【发布时间】:2012-02-08 03:36:36
【问题描述】:

我正在处理一个使用绝对路径引用另一个文件的二进制文件。 该路径同时包含日文和 ascii 字符。

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

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

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

将这些字节转换为字符串的最快和最干净的方法是什么?编码是已知的。相同的技术是否适用于旧版本的 python。

【问题讨论】:

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

标签: unicode python-3.x string-parsing


【解决方案1】:

这听起来像是您因为误解了 Unicode 和编码的基础知识而成为受害者。可能你没有,但误解是常见且可以理解的,而你描述的情况则不是。

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

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

如果不是,请说明您的来源是什么,并举例说明您提供的字节字符串(ASCII/HEX)。

【讨论】:

    猜你喜欢
    • 2011-11-14
    • 2016-12-10
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多