huolong blog

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库的吗….