Python:将utf-8名目标文件转换成gbk名目标文件
需求:将utf-8名目标文件转换成gbk名目标文件
实现代码如下:
def ReadFile(filePath,encoding="utf-8"): with codecs.open(filePath,"r",encoding) as f: return f.read() def WriteFile(filePath,u,encoding="gbk"): with codecs.open(filePath,"w",encoding) as f: f.write(u) def UTF8_2_GBK(src,dst): content = ReadFile(src,encoding="utf-8") WriteFile(dst,content,encoding="gbk")
代码讲授:
函数ReadFile的第二个参数指定以utf-8名目标编码方法读取文件,返回的功效content为Unicode
然后,在将Unicode以gbk名目写入文件中。
这样就能实现需求。
可是,假如要转换名目标文件中包括有一些字符并不包括在gbk字符会合的话,就会报错,雷同如下:
UnicodeEncodeError: 'gbk' codec can't encode character u'\xa0' in position 4813: illegal multibyte sequence
以上的报错信息的意思是:在将Unicode编码成gbk的时候,不能将Unicode u'\xa0'编码成gbk。
这里,我们需要弄清楚gb2312、gbk和gb18030三者之间的干系
GB2312:6763个汉字
GBK:21003个汉字
GB18030-2000:27533个汉字
GB18030-2005:70244个汉字
所以,GBK是GB2312的超集,GB18030是GBK的超集。
理清了干系之后,我们进一步改造下代码:
def UTF8_2_GBK(src,dst): content = ReadFile(src,encoding="utf-8") WriteFile(dst,content,encoding="gb18030")
运行后,发明没有报错,可以正常运行。
因为,在GB18030字符会合,可以找到u'\xa0'对应的字符。
另外,尚有别的一种实现方案:
需要修改下WriteFile要领
def WriteFile(filePath,u,encoding="gbk"): with codecs.open(filePath,"w") as f: f.write(u.encode(encoding,errors="ignore"))
这里,我们将Unicode编码(encode)成gbk名目,可是留意encode函数的第二个参数,我们赋值"ignore",暗示在编码的时候,忽略掉那些无法编码的字符,
解码同理。
可是,当我们执行后,发明可以乐成的将utf-8名目标文件修改成了ansi名目。但,别的发明生成的文件中,每个一行都有一行空行。
这里,可以指定以二进制流的形式写文件,修改后的代码如下:
def WriteFile(filePath,u,encoding="gbk"): with codecs.open(filePath,"wb") as f: f.write(u.encode(encoding,errors="ignore"))