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

问题描述

我正在解析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 

代码可以运行,但是会打印出损坏的字符。其他stackoverflow问题建议我使用编码和解码。例如,对于韩文,我尝试 file.read().encode('latin1').decode('euc-kr'),但是什么也没做。我还尝试使用utf-8文件转换iconv,但是在转换后的文本文件中字符仍然损坏。

任何建议将不胜感激。

解决方法

对不起,没有。 ISO-8859-1不能包含任何中文,日文或韩文字符。代码页最初不支持它们。

您在代码中所做的是让Python假定文件采用ISO-8859-1编码,并返回 Unicode 字符(即字符串的构建方式)。如果您未在encoding中指定open()参数,则默认值为假设UTF-8编码在文件中使用 ,并且仍以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 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...