用户工具

站点工具


单个字节丢失导致的gbk--_utf8出错的研究

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
单个字节丢失导致的gbk--_utf8出错的研究 [2023/12/05 14:59] MNBVC项目组单个字节丢失导致的gbk--_utf8出错的研究 [2023/12/05 15:01] (当前版本) MNBVC项目组
行 1: 行 1:
 经过长时间的调查研究,初步确定部分文本在进行 GBK-->UTF-8编码转换时会遇到个别字节缺失导致的转码出错中断或转码结果乱码的情况。 经过长时间的调查研究,初步确定部分文本在进行 GBK-->UTF-8编码转换时会遇到个别字节缺失导致的转码出错中断或转码结果乱码的情况。
  
-===== 案例1: =====+==== 案例1: ====
  
 以 20230101/aliyun.20230101.8.武侠小说/1184.txt 第563行为例: 以 20230101/aliyun.20230101.8.武侠小说/1184.txt 第563行为例:
行 18: 行 18:
 </code> </code>
  
-假如我们把删掉 ''\xd6\xd0\xb9\xfa\xc8\xcb'' 的第2个字节`xd0`,让它变成 ''\xd6\xb9\xfa\xc8\xcb'' ,再对它进行decode,程序就会报错了: //UnicodeDecodeError: 'gbk' codec can't decode byte 0xfa in position 2: illegal multibyte sequence//,程序在进行中文编码转换时按两个字节一组进行decode,但它无法正确的识别并转换 ''\xd6\xb9'', 所以就报错了。+假如我们把删掉 ''\xd6\xd0\xb9\xfa\xc8\xcb'' 的第2个字节 **xd0**,让它变成 ''\xd6\xb9\xfa\xc8\xcb'' ,再对它进行decode,程序就会报错了: //UnicodeDecodeError: 'gbk' codec can't decode byte 0xfa in position 2: illegal multibyte sequence//,程序在进行中文编码转换时按两个字节一组进行decode,但它无法正确的识别并转换 ''\xd6\xb9'', 所以就报错了。
  
-==== 乱码原因: ==== +==== 乱码原因的两种情况: ==== 
- +
-**乱码原因分两种情况:**+
  
   - 程序主动跳过出错的单字节,把单字节前后的内容拼起来作为一个新的双字节GBK字符,如果恰好新组成的双字节可以被转换成一个汉字(但已失去原意),程序会持续将错就错转换下去,直到下一个双字节无法识别抛出错误为止   - 程序主动跳过出错的单字节,把单字节前后的内容拼起来作为一个新的双字节GBK字符,如果恰好新组成的双字节可以被转换成一个汉字(但已失去原意),程序会持续将错就错转换下去,直到下一个双字节无法识别抛出错误为止
行 37: 行 35:
  
  
-我们可以很清楚的看到这段文本因为errors="ignore" 的作用,会跳过识别错误的单字节,把后续的字节尽量按GBK编码的方式识别,但是早已经丢失了原意,这也是因为该段落文本中出现单个字节丢失的原因导致的。+ 
 +我们可以很清楚的看到这段文本因为 ''errors="ignore"'' 的作用,会跳过识别错误的单字节,把后续的字节尽量按GBK编码的方式识别,但是早已经丢失了原意,这也是因为该段落文本中出现单个字节丢失的原因导致的。
  
 为什么很多GBK文本出现一次或者多次单个字节丢失的情况我们还不得而知,不过基于以上的研究,我们可以设计一个新的编码识别转换的方法,就是想办法正确的标记单个字节丢失的真正位置,再交由人工进行识别处理,并借助其他自动化或者AI工具 ,补全这些字符。 为什么很多GBK文本出现一次或者多次单个字节丢失的情况我们还不得而知,不过基于以上的研究,我们可以设计一个新的编码识别转换的方法,就是想办法正确的标记单个字节丢失的真正位置,再交由人工进行识别处理,并借助其他自动化或者AI工具 ,补全这些字符。
单个字节丢失导致的gbk--_utf8出错的研究.1701759563.txt.gz · 最后更改: 2023/12/05 14:59 由 MNBVC项目组