乱码问题的一些解决方案

这几天,对于系统转码有更多的了解,再写一点。

在PYTHON中,所有在屏幕中的文本都是UNICODE文本,且系统只识别UNICODE文本。python读取文件的默认编码是UTF-8。
office全家桶的默认编码是GBK。(在中国)
windows默认编码是GBK。

最小的编码是GB2312,然后是GBK,最大是BIG-5.

当系统读取其他码率的文本的时候,百分百中文会报错,英文有一部分编码不会错。


在将屏幕中的文字以其他码率保存到文件中,要进行编码encode。如果从文件中读取其他码率的内容,要进行解码decode。

换一种解释的话,encode是压缩,而decode是解压缩。

常见的编码有屏幕显示用的UNICODE,UTF-8,中文的GB2312和中文扩展GBK、BIG5。
UTF-8支持中文和表情包(比如说笑脸)。

UTF-8转成GBK格式的时候表情包会报错。

mysql数据库中的UTF8不是正规的UTF-8,UTF8是三个字节的,UTF-8是四个字节的。mysql对应的是UTF8mb4.

当PYTHON遇见不识别的码率的时候,会报错。

UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence

如果是全部无法解码,报错:多个字符串无法解码。无法解码bytes。
这种报错会直接跳出程序体,是error而不是warn。

如果是少量报错,可以写:

 file=open(root_log,'w',encoding='gb2312'errors='replace')

这样乱码的内容会显示???????

这是我通过replace进行UTF-8转GBK格式的文本。

你好:? ? ? ? 姓名:赵林 ? ? ? ?emos账号:zhaolin? ? ? ? 青岛市移动公司 ? ?网络部 ? ?网优中心? ? ? ? ? 登录这个系统:http://10.24.170:7090/drp/? ? ? ? 登录维修物料账套? ? ? ? 我应该是新增账户,之前没有账号。? ? ? ? 删除青岛网优中心weiyi账号。zhaoli1@sd.chinamobile.com?使用O
tip:明显UTF-8编码大于GBK编码的字符集……

如果使用IGNORE会显示各种各样的乱码。比如梅花星星等等等等。

如果要识别不同码率的文字,我通常使用try……except……

try:
    f=open('XXXXX','r',encoding='utf-8')
except:
    f=open('XXXXX','r',encoding='GBk',errors='replace')

如果不行的话再多写几个判断……正常也就GBK和UTF-8多一些。

PYTHON环境默认解码是UTF-8,中国的WINDOWS默认环境是GBK(也可能是GB2312)。所以要手写环境默认解码。

也就是说:如果你写了一个f=open(XXXX)的PYTHON程序,那么默认写了一个 encoding=“UTF-8”。
可以在文件前写一个默认注释行:

-- mode: python ; coding: utf-8 --

python中str字符串默认是UNICODE解码,types是TYPES解码。

邮件默认有这两种解码:UTF-8和GB2312解码。这个看邮箱心情……
在这里插入图片描述
邮箱会写明文件要以什么格式进行解码。

在给数据库导入数据的时候,要先识别编码再导入,不然会报错。
navicat有自动识别文件编码的能力,UES也有,如果不想安装,系统中默认的TXT阅读器(就是下面这个)就可以。

在这里插入图片描述

dbeaver没有自动解码的能力,要手工给编码。
当然,我自己觉得dbeaver用得顺手……

PYTHON有识别编码的软件chardet,但是被吐槽有点慢……
然后就是识别text/html的时候会乱码(认为是一种其他码率),网上找了一个代码来解决(未尝试)

import re
from html import unescape
 
def html_to_plain_text(html):
    text = re.sub('<head.*?>.*?</head>', '', html, flags=re.M | re.S | re.I)
    text = re.sub('<a\s.*?>', ' HYPERLINK ', text, flags=re.M | re.S | re.I)
    text = re.sub('<.*?>', '', text, flags=re.M | re.S)
    text = re.sub(r'(\s*\n)+', '\n', text, flags=re.M | re.S)
    return unescape(text)

效果挺不错,但是看不懂……

大概内容如上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值