设为首页 收藏本站
查看: 1720|回复: 0

[经验分享] Python3 处理 gb18030 乱码

[复制链接]

尚未签到

发表于 2018-8-7 09:25:16 | 显示全部楼层 |阅读模式
# 修理 gb18030文件  
# 将乱码转化为十六进制字符串,例如:b'\xff' 转为字符串 0xFF
  
# 将不可打印单字节转为十六进制字符串,例如:b'\xff' 转为字符串 0x7F
  
# srcFile 为原始 gb18030文件
  
# dstFile 为修理后的 gb18030文件
  
# explicit 控制是否转换为不可打印字符: explicit 为 False 是不转换(默认),否则转换
  
def RepairGB18030File(srcFile, dstFile, explicit=False):
  with open(srcFile, mode='rb') as fin:
  byteText = fin.read()
  byteLength = len(byteText)
  print('byteLength: %d' % byteLength)
  pos = 0# 位置
  byteList = list()
  # 末尾添加2对\r\n防止pos溢出
  byteText += b'\x0d\x0a\x0d\x0a'
  while pos < byteLength:
  byte1 = bytes([byteText[pos]])
  byte2 = bytes([byteText[pos+1]])
  byte3 = bytes([byteText[pos+2]])
  byte4 = bytes([byteText[pos+3]])
  # 单字节汉字(正常)
  if b'\x00' <= byte1 <= b'\x7f':
  pos += 1
  if byte1.decode('gb18030').isprintable(): # 可打印字符
  byteList.append(byte1)
  continue
  if byte1 in (b'\x0d', b'\x0a'): # 换行符
  byteList.append(byte1)
  continue
  if explicit:# 要求转换不可打印字符
  byteNew = (&quot;0x%02X&quot; % ord(byte1)).encode('gb18030')
  byteList.append(byteNew)
  else:# 不要求转换不可打印字符
  byteList.append(byte1)
  # 多字节汉字(双字节或四字节)
  elif b'\x81' <= byte1 <= b'\xfe':
  #双字节(正常)
  if (b'\x40' <= byte2 <= b'\x7e') or (b'\x80' <= byte2 <= b'\xfe'):
  pos += 2
  byteList.extend([byte1, byte2])
  continue
  #四字节
  if b'\x30' <= byte2 <= b'\x39':
  # 四字节(正常)
  if (b'\x81' <= byte3 <= b'\xfe') or (b'\x30' <= byte4 <= b'\x39'):
  pos += 4
  byteList.extend([byte1, byte2, byte3, byte4])
  continue
  # 四字节乱码
  pos += 1#错误的时候只能移动一个字节
  byteNew = (&quot;0x%02X&quot; % ord(byte1)).encode('gb18030')
  byteList.append(byteNew)
  continue
  # 双字节乱码
  #0x00-0x2f、0x7f、0xff
  pos += 1#错误的时候只能移动一个字节
  byteNew = (&quot;0x%02X&quot; % ord(byte1)).encode('gb18030')
  byteList.append(byteNew)
  else:
  # 单字节乱码
  #应该只剩 0x80 和 0xff
  byteNew = (&quot;0x%02X&quot; % ord(byte1)).encode('gb18030')#4个字节
  pos += 1#错误的时候只能移动一个字节
  byteList.append(byteNew)
  repairedText = b''.join(byteList).decode('gb18030')
  with open(dstFile, mode='w', encoding='gb18030') as fout:
  fout.write(repairedText)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-547980-1-1.html 上篇帖子: python第二章 变量 下篇帖子: centos7编译安装python3.6.2-QiuH
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表