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应用程序的基础 ...
最新文章
- es6在原生代码的用法_关于ES6的模块化
- ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var mysql 启动不了
- 通过案例学调优之--SQL Profile
- esri geometry-api-java的maven创建
- 北理在线作业c语言,北理线性代数在线作业-20210414115922.doc-原创力文档
- bool 取反_dataframe根据bool值高效地进行多重条件筛选的
- 深度优先搜索——选数(洛谷 P1036)
- python更改数据框指定位置的数据_python – 移动数据框列并更改列顺序
- 华为服务器修改登录密码,服务器登录修改密码
- Java-注解第一篇认识Annotation
- 【优化算法】供需优化算法(SDO)【含Matlab源码 1804期】
- SpringBoot中前后端数据交互
- x-bov16 firmware android,MSD0431XX 松下
- 对日软件工程师的几种招聘要求
- python 聊天机器人 中文_ 小智,又一个中文聊天机器人
- 阿里云CDN 使用问题汇总
- ADO 从ACCESS数据库读取图片并显示出来
- 解决双硬盘下一个windows两个linux操作系统的grub引导问题
- 【千律】OpenCV基础:图像阈值分割 -- 自适应阈值分割 -- 代码实现
- c ++内联函数_内联MHTML +数据URI
热门文章
- win8计算机无法安装打印机驱动,win8怎么安装打印机驱动
- 数字转中文数字与中文数字转数字
- 数据量大的情况下,WPS excel如何批量间隔一行或多行进行插入空行操作
- 中职学机电一体化好还是计算机好,男生读职校选择什么专业比较好
- CentOS 7编译安装PHP 7.4提示 libzip 版本问题
- BLE与经典蓝牙的应用
- 硬盘结构受损—数据恢复
- java计算机毕业设计服装定制管理系统源码+mysql数据库+系统+lw文档+部署
- Ubuntu和Window系统时间不一致(解决方法,详细步骤~)
- Mysql的优化和架构浅析