Python 3:读取UCS-2(BE)文件

16

在使用Python 3.3的内置open()函数(堆栈跟踪显示UnicodeDecodeError并包含我的readLine()方法)时,我似乎无法解码UCS-2 BE文件(旧版本的东西)-实际上,我找不到指定此编码的标志。

我使用Windows 8,在终端中设置代码页为65001,使用'Lucida Console'字体。

我猜代码片段不会有太大帮助:

def display_resource():
    f = open(r'D:\workspace\resources\JP.res', encoding=<??tried_several??>)
    while True:
        line = f.readline()
        if len(line) == 0:
            break

感谢任何对此问题的见解。

1个回答

38

UCS-2 是 UTF-16, 无论任何情况下,对于在其被称为 UCS-2 时被分配的任何代码点。

使用encoding='utf16'打开它。如果没有 BOM(字节顺序标记,即起始处的 2 个字节,对于 BE(大端)来说是 \xfe\xff),则使用encoding='utf_16_be'强制指定字节顺序。


你好Martijn,我也认为UTF16应该可以工作(基于你提供的同一篇文章)。它确实可以工作,但是,就像utf_16_be一样,对于所有日语字母,我在屏幕上得到的都是相同的字符 - 例如“ブラウザー”变成了一堆相同的“无法阅读”的字符(方块)。我应该再次区分两者 - 读取行和打印行。这也是终端的限制吗?如果读取正常,并且我可以使用字符串,那么我可以将它们写回另一个UCS2文件并在启用UCS2的编辑器中获得“正确”的输出吗? - elder elder
1
这是终端的限制,恐怕无法更改。您的字体不支持这些字符;您需要找到一个支持它们的不同字体。仅因为终端无法显示它们并不意味着数据本身已经损坏,所以如果您在写入文件时重新编码为UTF-16,则可以使用其他工具再次打开它。 - Martijn Pieters
只是想补充一下,我发现了 Lucida Console 的另一个限制,也许将来会有所帮助:当显示日语、中文、阿拉伯、俄罗斯、罗马尼亚字符时,它有时会重复一行中的最后几个字符 - 有时只是换行符,有时多达7-8个字符。这种行为似乎是随机的。将这些行写入文件后,它们将以正确的方式显示出来(在我的情况下使用适当的编码 - UTF16)。 - elder elder
1
@elderelder:这很可能是Windows控制台或字体的问题。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接