python源码编译安装 gb18030_Python3 处理 gb18030 乱码
【环境】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 乱码相关推荐
- python源码编译安装 gb18030_源代码编译安装Python3.5.2
由于没有找到Python3.5的rpm安装包,因此进行源代码编译安装 1.下载Python3.5.2 [root@seastar ~]# cd /usr/local/src [root@seastar ...
- Python的安装(源码编译安装,IDE安装)
一.Python源码编译安装 安装的简单步骤: 1.官网上下载安装包 2.解压安装包 3.安装编译过程需要的依赖性:gcc, zlib, zlib-devel, openssl-devel,readl ...
- python源码编译 mingw_使用mingw32 在windows python26 下编译安装4suite-xml
最近在研究python下xml处理技术,需要在windows python26平台下安装4suite-xml. 但是4suite-xml在官网上只提供的最新安装包只支持到python25,也就是说只能 ...
- 【Python 笔记】Linux 下源码编译安装 python
本文记录在 Linux 上源码编译安装 python 的过程. 文章目录 1. 源码编译安装说明 2. 安装 python2.7 3. 安装 python3.6 1. 源码编译安装说明 安装过程比我想 ...
- Python 3.10版本及其依赖项 Linux下源码编译 安装到指定路径/目录
Python 3.10版本及其依赖项 Linux下源码编译 安装到指定路径/目录 安装需求 准备工作 Python及其依赖项 libffi glibc GDBM mpdecimal bz2 xz re ...
- python版本升级后编译_ubuntu18.04下源码编译安装最新版本Python3
截止到2019年4月9日,Python3最新的版本是3.7.3. 在ubuntu18.04中已经安装的Python3版本是3.6.7,下面我们就演示一下如何在ubuntu18.04下源码编译安装Pyt ...
- python 3.10.0源码编译安装
python 3.10.0源码编译安装 文章目录 python 3.10.0源码编译安装 1. 安装编译依赖工具 2. 下载python 3.10.0 3. 编译安装 Python 4. 体验 1. ...
- 如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文主要介绍如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib. OpenC ...
- CentOS 7上源码编译安装和配置LNMP Web+phpMyAdmin服务器环境
什么是LNMP? LNMP(别名LEMP)是指由Linux, Nginx, MySQL/MariaDB, PHP/Perl/Python组合成的动态Web应用程序和服务器,它是一组Web应用程序的基础 ...
最新文章
- CentOs7中安装python3.7.6
- 微服务项目用了几台服务器,微服务部署运维
- Java Socket实战之五:使用加密协议传输对象
- Android人脸识别App(带web上传注册信息)
- leetcode-字符串中的第一个唯一字符
- python 类方法调用一次自增1_Python+selenium自动化脚本如何使数字每次执行自增1
- html5调盒子边框大小,CSS3 - 盒子大小(CSS3 - Box Sizing)
- 微型计算机一般不采用的控制方式,微型计算机控制作业.doc
- RabbitMQ实例教程:发布/订阅者消息队列
- 【数字图像处理】一种求图像边缘的方法
- 「镁客早报」蓝色起源完成无人火箭试飞;知名对冲基金做空高通...
- bat脚本_获取管理员权限
- 北京的哪些地方开的发票可参与国家税务局的摇奖
- amd服务器虚拟化,着眼未来 AMD皓龙产品从“芯”实现虚拟化
- 【数字信号调制】基于 AM+FM+DSB+SSB实现信号调制解调含Matlab源码
- 基于java+mysql的Swing+MySQL火车票售票管理系统
- p2psearcher4.0 绿色版下载
- 如何快速制作彩色二维码图片?
- STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验
- 转:世界第一台VCD机
热门文章
- RL-D1电流继电器
- learn more study less:如何高效学习
- iZotope Iris 2 for Mac(音频采样合成器)
- 把USB打印机变成WI-FI打印机
- vue中图片引入问题以及实现openlayers地图标记
- c++ 一个多线程log的实现
- 记录一个bug 关于 java 解压缩包 写入本地报错 :java.io.FileNotFoundException(系统找不到指定的路径。)
- vscode 运行代码快捷键(Code Runner)
- (声纳+惯性+视觉)Sonar Visual Inertial SLAM of Underwater Structures
- 读书笔记系列《增广贤文》