【环境】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. es6在原生代码的用法_关于ES6的模块化
  2. ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了
  3. 通过案例学调优之--SQL Profile
  4. esri geometry-api-java的maven创建
  5. 北理在线作业c语言,北理线性代数在线作业-20210414115922.doc-原创力文档
  6. bool 取反_dataframe根据bool值高效地进行多重条件筛选的
  7. 深度优先搜索——选数(洛谷 P1036)
  8. python更改数据框指定位置的数据_python – 移动数据框列并更改列顺序
  9. 华为服务器修改登录密码,服务器登录修改密码
  10. Java-注解第一篇认识Annotation
  11. 【优化算法】供需优化算法(SDO)【含Matlab源码 1804期】
  12. SpringBoot中前后端数据交互
  13. x-bov16 firmware android,MSD0431XX 松下
  14. 对日软件工程师的几种招聘要求
  15. python 聊天机器人 中文_ 小智,又一个中文聊天机器人
  16. 阿里云CDN 使用问题汇总
  17. ADO 从ACCESS数据库读取图片并显示出来
  18. 解决双硬盘下一个windows两个linux操作系统的grub引导问题
  19. 【千律】OpenCV基础:图像阈值分割 -- 自适应阈值分割 -- 代码实现
  20. c ++内联函数_内联MHTML +数据URI

热门文章

  1. win8计算机无法安装打印机驱动,win8怎么安装打印机驱动
  2. 数字转中文数字与中文数字转数字
  3. 数据量大的情况下,WPS excel如何批量间隔一行或多行进行插入空行操作
  4. 中职学机电一体化好还是计算机好,男生读职校选择什么专业比较好
  5. CentOS 7编译安装PHP 7.4提示 libzip 版本问题
  6. BLE与经典蓝牙的应用
  7. 硬盘结构受损—数据恢复
  8. java计算机毕业设计服装定制管理系统源码+mysql数据库+系统+lw文档+部署
  9. Ubuntu和Window系统时间不一致(解决方法,详细步骤~)
  10. Mysql的优化和架构浅析