python的GBK和UTF-8编码转换相关报错: multi-byte encodings are not supported,‘gbk‘ codec can‘t 解决办法

    技术2023-10-13  74

    用Python解析编码为gb2312的xml, <?xml version="1.0" encoding="gb2312" ?> <node>...</node> 会报错:ValueError: multi-byte encodings are not supported 试过ElementTree和minidom,都是如此。

    解决办法:(很多博客里encode、decode用法搞错了) 方法一:

    用notepad能打开的话,先转化成utf-8,再将gb2312替换成utf-8;

    方法二:

    #测试的例子:############################################ dstr="dfasd" print(type(dstr)) #<class 'str'> dstr = dstr.encode('gb2312') print(type(dstr)) #<class 'bytes'> dstr = dstr.decode('utf-8') print(type(dstr)) #<class 'str'> dstr = dstr.replace('gb2312', 'utf-8') ############################################ data_file = open(r'E:\project\python\learn\data\wf_ta2ts-GLXT.XML', 'r') new_data_file = open(r'E:\project\python\learn\data\new_wf_ta2ts-GLXT.XML', 'w',encoding='utf-8') new_data_file.truncate() for line in data_file: line = line.encode('gb2312','ignore').decode('gb2312',"ignore").replace('gb2312', 'utf-8') new_data_file.write(line+ '\n') data_file.close() new_data_file.close()

    注释: 1、 指定打开文件的编码格式和写入的编码格式要匹配:     f = open("out.html","w") ,在windows下面,新文件打开的默认编码是gbk;     f = open("out.html","w",encoding='utf-8'),要指定打开文件的编码格式;     line = line.encode('gb2312','ignore').decode('gb2312',"ignore").replace('gb2312', 'utf-8')     new_data_file.write(line+ '\n')     指定打开文件的编码格式和写入的编码格式要匹配,否则会报错:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position XXX 2、GBK解码时忽略掉不能解码的数据:     line = line.encode('gb2312','ignore').decode('gb2312',"ignore").replace('gb2312', 'utf-8') 3、字符串和bytes类型相互转换: (1)按 gb2312 的方式编码,转成 bytes     dstr = dstr.encode('gb2312')     print(type(dstr))  输出:#<class 'bytes'> (2)bytes解码成字符串,将gb2312编码的二进制字符转化成utf-8的字符串     dstr = dstr.decode('gb2312')      print(type(dstr))  #<class 'str'>

    注意下图中:# 报错,因为str1是gb2312编码的二进制,转化成UTF-8字符串时会报错

    1.decode() bytes.decode(encoding=“utf-8”, errors=“strict”) 1.这个函数是bytes类型数据调用的,字符串str类型是不能够调用的。(好多文章说字符串也可以调用该函数,我是真搞不懂。) 2.该函数返回字符串。换句话说是bytes类型转化成str类型的函数。 3.encoding规定解码方式。bytes数据是由什么编码方式编码的,该函数encoding参数就必须用相应解码方式,这样才能返回正确字符串。解码后的字符串自动转为unicode编码方式。 4.errors参数默认为strict,即解码错误后引起异常发生。其他参数值为ignore,replace等。

    2.encode() str.encode(encoding=“utf-8”, errors=“strict”) 参数含义同上。这个函数将字符串转化成相应编码方式的字节形式。对于ASCII字符(数字,英文,部分标点符号)而言,不同编码方式编码后的字节是一样的。但是对于中文来说,编码后的字节不一样。

     

    Processed: 0.023, SQL: 9