【环境】Windows 10 x64

Python 3.6.3

【关于 gb18030 编码】单字节,其值从0到0x7F。

双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE(不包括0x7F)。

四字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39。

【解码错误的处理方式】错误:UnicodeDecodeError: 'gb18030' codec can't decode byte 0xff in position 129535: illegal multibyte sequenceimport codecs

# gb18030 乱码 handler

def WalkerGB18030ReplaceHandler(exc):

print('exc.start: %d' % exc.start)

print('exc.end: %d' % exc.end)

print('exc.encoding: %s' % exc.encoding)

print('exc.reason: %s' % exc.reason)

text = ''

for ch in exc.object[exc.start:exc.end]:

print('ch:')

print(ch)

text += ('0x%02X' % ch)

return (text, exc.end)

# 注册自定义handler

codecs.register_error("myreplace", WalkerGB18030ReplaceHandler)

* 方案二:自定义编码清洗# 修理 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

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 = ("0x%02X" % 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 = ("0x%02X" % ord(byte1)).encode('gb18030')

byteList.append(byteNew)

continue

# 双字节乱码

#0x00-0x2f、0x7f、0xff

pos += 1#错误的时候只能移动一个字节

byteNew = ("0x%02X" % ord(byte1)).encode('gb18030')

byteList.append(byteNew)

else:

# 单字节乱码

#应该只剩 0x80 和 0xff

byteNew = ("0x%02X" % 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)

【相关阅读】

python源码编译安装 gb18030_Python3 处理 gb18030 乱码相关推荐

  1. python源码编译安装 gb18030_源代码编译安装Python3.5.2

    由于没有找到Python3.5的rpm安装包,因此进行源代码编译安装 1.下载Python3.5.2 [root@seastar ~]# cd /usr/local/src [root@seastar ...

  2. Python的安装(源码编译安装,IDE安装)

    一.Python源码编译安装 安装的简单步骤: 1.官网上下载安装包 2.解压安装包 3.安装编译过程需要的依赖性:gcc, zlib, zlib-devel, openssl-devel,readl ...

  3. python源码编译 mingw_使用mingw32 在windows python26 下编译安装4suite-xml

    最近在研究python下xml处理技术,需要在windows python26平台下安装4suite-xml. 但是4suite-xml在官网上只提供的最新安装包只支持到python25,也就是说只能 ...

  4. 【Python 笔记】Linux 下源码编译安装 python

    本文记录在 Linux 上源码编译安装 python 的过程. 文章目录 1. 源码编译安装说明 2. 安装 python2.7 3. 安装 python3.6 1. 源码编译安装说明 安装过程比我想 ...

  5. Python 3.10版本及其依赖项 Linux下源码编译 安装到指定路径/目录

    Python 3.10版本及其依赖项 Linux下源码编译 安装到指定路径/目录 安装需求 准备工作 Python及其依赖项 libffi glibc GDBM mpdecimal bz2 xz re ...

  6. python版本升级后编译_ubuntu18.04下源码编译安装最新版本Python3

    截止到2019年4月9日,Python3最新的版本是3.7.3. 在ubuntu18.04中已经安装的Python3版本是3.6.7,下面我们就演示一下如何在ubuntu18.04下源码编译安装Pyt ...

  7. python 3.10.0源码编译安装

    python 3.10.0源码编译安装 文章目录 python 3.10.0源码编译安装 1. 安装编译依赖工具 2. 下载python 3.10.0 3. 编译安装 Python 4. 体验 1. ...

  8. 如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文主要介绍如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib. OpenC ...

  9. CentOS 7上源码编译安装和配置LNMP Web+phpMyAdmin服务器环境

    什么是LNMP? LNMP(别名LEMP)是指由Linux, Nginx, MySQL/MariaDB, PHP/Perl/Python组合成的动态Web应用程序和服务器,它是一组Web应用程序的基础 ...

最新文章

  1. CentOs7中安装python3.7.6
  2. 微服务项目用了几台服务器,微服务部署运维
  3. Java Socket实战之五:使用加密协议传输对象
  4. Android人脸识别App(带web上传注册信息)
  5. leetcode-字符串中的第一个唯一字符
  6. python 类方法调用一次自增1_Python+selenium自动化脚本如何使数字每次执行自增1
  7. html5调盒子边框大小,CSS3 - 盒子大小(CSS3 - Box Sizing)
  8. 微型计算机一般不采用的控制方式,微型计算机控制作业.doc
  9. RabbitMQ实例教程:发布/订阅者消息队列
  10. 【数字图像处理】一种求图像边缘的方法
  11. 「镁客早报」蓝色起源完成无人火箭试飞;知名对冲基金做空高通...
  12. bat脚本_获取管理员权限
  13. 北京的哪些地方开的发票可参与国家税务局的摇奖
  14. amd服务器虚拟化,着眼未来 AMD皓龙产品从“芯”实现虚拟化
  15. 【数字信号调制】基于 AM+FM+DSB+SSB实现信号调制解调含Matlab源码
  16. 基于java+mysql的Swing+MySQL火车票售票管理系统
  17. p2psearcher4.0 绿色版下载
  18. 如何快速制作彩色二维码图片?
  19. STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验
  20. 转:世界第一台VCD机

热门文章

  1. RL-D1电流继电器
  2. learn more study less:如何高效学习
  3. iZotope Iris 2 for Mac(音频采样合成器)
  4. 把USB打印机变成WI-FI打印机
  5. vue中图片引入问题以及实现openlayers地图标记
  6. c++ 一个多线程log的实现
  7. 记录一个bug 关于 java 解压缩包 写入本地报错 :java.io.FileNotFoundException(系统找不到指定的路径。)
  8. vscode 运行代码快捷键(Code Runner)
  9. (声纳+惯性+视觉)Sonar Visual Inertial SLAM of Underwater Structures
  10. 读书笔记系列《增广贤文》