在 python 中读取 ISO-8859-1 文件时损坏的 CJK 数据

broken CJK data when reading ISO-8859-1 file in python

我正在解析一些 ISO-8859-1 文件,其中包含中文、日文、韩文字符。

import os
from os import listdir

cnt = 0
base_path = 'data/'
cwd = os.path.abspath(os.getcwd())
for f in os.listdir(base_path):
    path = cwd + '/' + base_path + f
    cnt = 0
    with open(path, 'r', encoding='ISO-8859-1') as file:
        for line in file:
            print('line {}: {}'.format(cnt, line))
            cnt +=1 

代码运行但打印出损坏的字符。其他 Whosebug 问题建议我使用编码和解码。例如,对于韩语文本,我试过 file.read().encode('latin1').decode('euc-kr'),但这并没有做任何事情。我还尝试使用 iconv 将文件转换为 utf-8,但转换后的文本文件中的字符仍然损坏。

如有任何建议,我们将不胜感激。

抱歉,没有。 ISO-8859-1 中不能包含任何中文、日文或韩文字符。代码页一开始就不支持它们。

您在代码中所做的是要求 Python 假设文件采用 ISO-8859-1 编码并且 return 个字符 采用 Unicode (这就是字符串的构建方式)。如果您没有在 open() 中指定 encoding 参数,默认情况下将假定 UTF-8 编码在文件 中使用 并且仍然 return 在Unicode中,即没有指定任何编码的逻辑字符。

现在的问题是这些 CJK 字符在文件中是如何编码的。如果您知道答案,只需将正确的编码参数放入 open() 即可立即生效。假设它是你提到的EUC-KR,代码应该是:

with open(path, 'r', encoding='euc-kr') as file:
    for line in file:
        print('line {}: {}'.format(cnt, line))
        cnt +=1 

如果您感到沮丧,请看一看chardet。它应该可以帮助您检测文本的编码。示例:

import chardet
with open(path, 'rb') as file:
    rawdata = file.read()
    guess = chardet.detect(rawdata) # e.g. {'encoding': 'EUC-KR', 'confidence': 0.99}
    text = guess.decode(guess['encoding'])
    cnt = 0
    for line in text.splitlines():
        print('line {}: {}'.format(cnt, line))
        cnt +=1