我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python3 处理 gb18030 乱

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python3 处理 gb18030 乱

环境

  • Windows 10 x64

  • Python 3.6.3


关于 gb18030 编码

  •  GB 18030 wiki:https://zh.wikipedia.org/wiki/GB_18030

  • 单字节,其值从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 sequence
  • bytes.decode

  • codecs.register_error 样例

  • 异常对象:UnicodeDecodeError

  • 方案一:自定义 replace_errors:

import 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
# class="lazy" data-srcFile 为原始 gb18030文件
# dstFile 为修理后的 gb18030文件
# explicit 控制是否转换为不可打印字符: explicit 为 False 是不转换(默认),否则转换
def RepairGB18030File(class="lazy" data-srcFile, dstFile, explicit=False):
	with open(class="lazy" data-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 = ("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)


相关阅读

1、关于 Python3 的编码

2、汉字字符集编码查询


*** walker 的流水账 *** 


Python3 处理 gb18030 乱

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python3 处理 gb18030 乱

【环境】Windows 10 x64Python 3.6.3【关于 gb18030 编码】 GB 18030 wiki:https://zh.wikipedia.org/wiki/GB_18030单字节,其值从0到0x7F。双字节,第一个字
2023-01-31

python3的异常处理

在python运行的时候难免出现一些异常,但是python在遇到异常的时候就会停止了,但是有时候我们需要python即使在有异常的时候也需要继续向下运行,这个时候我们就需要用到异常处理了.1.简单的异常处理如:print(a)Traceba
2023-01-31

python3:Python 异常处理以

try …except…else 语句是处理异常公式, try 是有可能抛异常的代码块, except 抓取异常的类型, else 是指当没有抓到抛错,就运行这块代码。请看下下边的例子:try: print("抓取的有可能的代码块")
2023-01-31

python3图片处理(笔记)

本次的基础:Image图片基本处理库和ImageFilter滤镜库一、图片处理from PIL import Image,ImageFilter# 1、打开图片img = Image.open(r'E:\python\material\i
2023-01-31

oracle乱码怎么处理

oracle 乱码是由字符集不匹配导致的。解决方法依次为:1. 确定数据库和会话字符集;2. 设置会话字符集;3. 导入数据时指定字符集;4. 导出数据时指定字符集;5. 更改数据库字符集(复杂,由经验者处理);6. 使用兼容模式(允许应用
oracle乱码怎么处理
2024-05-21

oracle乱码如何处理

oracle 乱码问题通常由字符集设置不当引起。解决方法包括:检查服务器、数据库和客户机字符集。根据需要设置服务器、数据库和客户机字符集。使用 convert 函数或 dbms_lob.convert_lob 函数修复乱码数据。始终指定字符
oracle乱码如何处理
2024-06-13

redis如何处理乱码

在Redis中处理乱码需要注意以下几个方面:1. 字符编码:Redis默认使用UTF-8编码,可以在配置文件中设置字符编码。如果出现乱码问题,可以检查Redis服务器和客户端的字符编码是否一致。2. 使用合适的数据结构:在存储数据时,使用合
2023-09-06

python3之DNS处理模块dnspy

dnspython(http://www.dnspython.org/)是Python实现的一个DNS工具包,它支持几乎所有的记录类型,可以用于查询、传输并动态更新ZONE信息,同时支持TSIG(事务签名)验证消息和EDNS0(扩展DNS)
2023-01-31

Python3 处理JSON的实例详解

Python3 处理JSON的实例详解 真的好简单,灰常简单import os, io, sys, re, time, base64, json import webbrowser, urllib.requestdef main():"ma
2022-06-05

Python3的异常捕获和处理

1.try 和 except 这是异常语句。使用了这个可以对报错的代码,也会继续 执行下去而不会报错,不执行后面的代码。try是捕获异常,在try里的代码执行如果出错后,就会执行在execpt里的代码。try: print(2/0)e
2023-01-31

SUPERSET中文乱码怎么处理

如果您在SUPERSET中看到了乱码,可能是由于以下原因:1. 数据源中存在非UTF-8编码的字符2. SUPERSET的编码设置不正确3. 操作系统的编码设置不正确解决方法:1. 确保您的数据源中的字符编码是UTF-8。如果不是,可以使用
2023-05-29

ApacheBeam如何处理乱序数据

Apache Beam 提供了一种称为水印(watermark)的机制,用于处理乱序数据。水印是一种时间戳,在处理数据时可以用来判断数据是否已经准备就绪。在处理乱序数据时,Beam 会根据水印来确定数据是否已经按照正确的顺序到达。在 Ap
ApacheBeam如何处理乱序数据
2024-03-07

html打开乱码怎么处理

打开html乱码的解决方法:1、检查文件编码格式(utf-8或gbk);2、确保meta标签有正确的字符集声明(utf-8);3、调整浏览器编码与文件编码一致;4、清除浏览器缓存;5、使用转码工具;6、检查特殊字符并转义或替换;7、启用un
html打开乱码怎么处理
2024-04-21

java处理乱码的几种方法

解决方式1(若乱码参数多,就比较低效)浏览器默认编码为ISO-8859-1,后端Servlet接收请求参数,按照ISO-8859-1进行解码,得到二进制流,然后再用UTF-8编码。示例代码: // 获得请求参数String queryString
java处理乱码的几种方法
2017-10-10

Python3如何进行表格数据处理

这篇文章主要介绍“Python3如何进行表格数据处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python3如何进行表格数据处理”文章能帮助大家解决问题。技术背景数据处理是一个当下非常热门的研究
2023-07-05

Python3多线程处理爬虫的实战

本文主要介绍了Python3多线程处理爬虫的实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-03-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录