iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python3 处理 gb18030 乱
  • 500
分享到

Python3 处理 gb18030 乱

2023-01-31 08:01:49 500人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

【环境】windows 10 x64python 3.6.3【关于 gb18030 编码】 GB 18030 wiki:https://zh.wikipedia.org/wiki/GB_18030单字节,其值从0到0x7F。双字节

环境


关于 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
# 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 < 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 的流水账 *** 


--结束END--

本文标题: Python3 处理 gb18030 乱

本文链接: https://www.lsjlt.com/news/192783.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python3 处理 gb18030 乱
    【环境】Windows 10 x64Python 3.6.3【关于 gb18030 编码】 GB 18030 wiki:https://zh.wikipedia.org/wiki/GB_18030单字节,其值从0到0x7F。双字节...
    99+
    2023-01-31
  • python3 requests 抓取乱
    遇到此问题后 设置r.encoding='gbk'或r.encoding='gb2312'后可以了注意:gbk范围要比gb2312要大,设置gbk要好python用到中文转拼音的一个包 xpinyin,但用pyinstaller生成exe时...
    99+
    2023-01-31
    requests
  • python3 urllib 爬虫乱码问
    #!/usr/bin/env python # -*- coding: utf-8 -*- from bs4 import BeautifulSoup from urllib.request import urlopen ba...
    99+
    2023-01-31
    爬虫 乱码 urllib
  • python3的异常处理
    在python运行的时候难免出现一些异常,但是python在遇到异常的时候就会停止了,但是有时候我们需要python即使在有异常的时候也需要继续向下运行,这个时候我们就需要用到异常处理了.1.简单的异常处理如: print(a) Trace...
    99+
    2023-01-31
    异常
  • python3:Python 异常处理以
    try …except…else 语句 是处理异常公式, try 是有可能抛异常的代码块, except 抓取异常的类型, else 是指当没有抓到抛错,就运行这块代码。请看下下边的例子: try: print("抓取的有...
    99+
    2023-01-31
    异常 Python
  • VSCODE+python3中文乱码问题
    被这个问题困扰了好久。各种百度各种尝试。最后在知乎找到了答案。 修改task.json,添加option那一坨: { "version": "0.1.0", "command": "python", "i...
    99+
    2023-01-31
    乱码 中文 VSCODE
  • redis如何处理乱码
    在Redis中处理乱码需要注意以下几个方面:1. 字符编码:Redis默认使用UTF-8编码,可以在配置文件中设置字符编码。如果出现...
    99+
    2023-09-06
    redis
  • python3图片处理(笔记)
    本次的基础:Image图片基本处理库和ImageFilter滤镜库 一、图片处理 from PIL import Image,ImageFilter # 1、打开图片 img = Image.open(r'E:\python\mate...
    99+
    2023-01-31
    图片处理 笔记
  • python3之DNS处理模块dnspy
    dnspython(http://www.dnspython.org/)是Python实现的一个DNS工具包,它支持几乎所有的记录类型,可以用于查询、传输并动态更新ZONE信息,同时支持TSIG(事务签名)验证消息和EDNS0(扩...
    99+
    2023-01-31
    模块 DNS dnspy
  • python3 做cgi 中文乱码问题
    开头加入以下代码解决import codecs, sys sys.stdout = codecs.getwriter('utf8')(sys.stdout.buffer)...
    99+
    2023-01-31
    乱码 中文 cgi
  • python3常见中文乱码解决
    日常工作中,常常遇到一些乱码,小记一下: 乱码一:python不能将汉字的bytes直接输出汉字,需要转换成Unicode,然后用print输出: str = b'\xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8...
    99+
    2023-01-31
    乱码 中文 常见
  • html打开乱码怎么处理
    打开html乱码的解决方法:1、检查文件编码格式(utf-8或gbk);2、确保meta标签有正确的字符集声明(utf-8);3、调整浏览器编码与文件编码一致;4、清除浏览器缓存;5、使...
    99+
    2024-04-21
    a标签
  • ApacheBeam如何处理乱序数据
    Apache Beam 提供了一种称为水印(watermark)的机制,用于处理乱序数据。水印是一种时间戳,在处理数据时可以用来判断...
    99+
    2024-03-07
    Beam
  • SUPERSET中文乱码怎么处理
    如果您在SUPERSET中看到了乱码,可能是由于以下原因:1. 数据源中存在非UTF-8编码的字符2. SUPERSET的编码设置不...
    99+
    2023-05-29
    SUPERSET中文乱码 SUPERSET
  • Python3的异常捕获和处理
    1.try 和 except 这是异常语句。使用了这个可以对报错的代码,也会继续 执行下去而不会报错,不执行后面的代码。try是捕获异常,在try里的代码执行如果出错后,就会执行在execpt里的代码。try: print(2/0)...
    99+
    2023-01-31
    异常
  • Python3 DataFrame缺失值的处理方法
    目录一、缺失值的判断二、缺失值数据的过滤三、缺失值数据的填充四、缺失值的删除一、缺失值的判断 在通过Pandas做数据分析时,数据中往往会因为一些原因而出现缺失值NaN (Nota ...
    99+
    2024-04-02
  • Python3多线程处理爬虫的实战
    多线程 到底什么是多线程?说起多线程我们首先从单线程来说。例如,我在这里看书,等这件事情干完,我就再去听音乐。对于这两件事情来说都是属于单线程,是一个完成了再接着完成下一个。但是我一...
    99+
    2023-03-02
    Python3多线程爬虫 Python 多线程爬虫
  • Python3如何进行表格数据处理
    这篇文章主要介绍“Python3如何进行表格数据处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python3如何进行表格数据处理”文章能帮助大家解决问题。技术背景数据处理是一个当下非常热门的研究...
    99+
    2023-07-05
  • SUPERSET中文乱码问题如何处理
    如果在SUPERSET中出现了中文乱码问题,可以尝试以下解决方法:1. 检查数据库字符集:确保数据库字符集和SUPERSET字符集一...
    99+
    2023-05-30
    SUPERSET中文乱码 SUPERSET
  • java串口通信乱码如何处理
    在Java中,串口通信乱码通常是由于字符编码不匹配引起的。为了解决乱码问题,可以尝试以下几种方法:1. 确保发送端和接收端的字符编码...
    99+
    2023-09-28
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作