Python编码问题
起因
估计正常人很难想到这两者之间的关系,又是折腾的一天,我对mingw-w64的编译器如何链接msvcrt.dll文件产生一些疑问,在看Windows网络编程的时候,开头要加上一句命令:
#pragma comment(lib,“WS2_32”)
通过这条命令来链接dll库,那么编译器是如何链接msvcrt.dll的,翻找了一些头文件,并未看到有相关的语句,一个个找又太麻烦,还是让脚本来帮我找一下吧,python撸一个脚本.
import os
path = "D:\\mingw\\mingw64\\x86_64-w64-mingw32\\include" #文件夹目录
files= os.listdir(path)
s = []
for file in files: #遍历文件夹
if os.path.isfile(path+"\\"+file):
f = open(path+"\\"+file,'r') #打开文件
str_f = f.readlines()
str = "#pragma comment"
if str in str_f:
s.append(file)
print(s) #打印结果
然后顺利发生异常,UnicodeDecodeError:‘gbk’ codec can’t decode byte 0x99 in position 2613: illegal multibyte sequence
python编码问题
一些基本概念
- 编码:将人类可识别的字符转换为机器可识别的字节码 / 字节序列
- 解码:编码的反向过程叫解码
- 字符集: 某个范围内字符的集合,不同的字符集规定了字符的个数,比如 ASCII 字符集总共有128个字符,包含了英文字母、阿拉伯数字、标点符号和控制符。而 GB2312 字符集定义了7445个字符,包含了绝大部分汉字字符。
- 字符是以字节为存储单位保存在文件中,文件保存在内存 / 物理磁盘中
- 编码和解码: 编码的过程是将字符转换成字节流,解码的过程是将字节流解析为字符。
编码问题的解决
python中使用open()函数,默认的解码方式取决于平台,在Windows平台下是gbk,如图
import locale
print(locale.getdefaultlocale())
输出结果:(‘zh_CN’, ‘cp936’),cp936就是gbk编码了.而文本文档的编码方式已经是utf-8了(这个变化我也不知道什么时候出现,很神奇,之前一直是默认ANSI,或者说gbk).我们需要使用utf-8格式来解码. 解决方法就是修改一行代码:
f = open(path+"\"+file,‘r’,encoding=‘utf-8’)
补充
Windows平台下在内存中编码方式是utf-16 le(little endian),保存到磁盘(文本文档)或者用于网络传输时的编码方式是utf-8,他们两个都是unicode字符集标准的一种实现,但是utf-8是变长编码,与ASCII兼容,utf-16 le则是双字节编码,长度是2字节或者4字节. 至于可执行文件的编码方式则是ANSI,中文操作系统环境下ANSI是GBK.
忘了说最后最后的搜索结果了,没有哪个文件包含这个句子,所以说有哪位大佬说一下它是怎么链接msvcrt.dll库的吗….