这几天,对于系统转码有更多的了解,再写一点。
在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)
效果挺不错,但是看不懂……
大概内容如上。