python在Windows下的中文编码问题,vscode等ide环境

python在Windows下的中文编码问题,vscode等ide环境

  • 中文编码 从代码到输出控制台 的 转换流程:
    • 1.代码编码
    • 2.输出流编码
    • 3.控制台编码

前言: 本文简述了python编码的转换过程. (3.)最后的代码块是编码转换的最终方案.实测在win控制台 和 vscode控制台调试下 皆可正常显示中文

中文编码 从代码到输出控制台 的 转换流程:

1.代码编码

# -*- coding: utf-8 -*-

设置了代码所用编码
注意:这行代码 只是告诉计算机 我当前所用编码, 并没有对编码进行转换 .实际编码 取决于保存文档时 设置的编码.

2.输出流编码

import sys
print sys.stdout.encoding

sys.stdout.encoding可以获取到输出流编码格式.

一些处理win下乱码问题的文章,会有如下代码:

# https://www.cnblogs.com/linn/p/7943424.html
class UnicodeStreamFilter:  
    def __init__(self, target):  
        self.target = target  
        self.encoding = 'utf-8'  
        self.errors = 'replace'  
        self.encode_to = self.target.encoding  
    def write(self, s):  
        if type(s) == str:  
            s = s.decode("utf-8")  
        s = s.encode(self.encode_to, self.errors)
        self.target.write(s)  
          
if sys.stdout.encoding == 'cp936':  
    sys.stdout = UnicodeStreamFilter(sys.stdout) 

以上代码 将代码编码(utf-8)转换为输出流编码(win下为’cp936’)
实测,以上方法在win控制台下 已经能正常输出中文,但是在一些ide(本人所用的是vs code)下,仍然存在乱码问题.
这说明输出流编码,仍不是控制台最终编码.

3.控制台编码

字符串 从代码 导成 输出流, 最后在控制台呈现,正确转换流程是:

代码文件编码 -> 输出流编码 -> 控制台编码

输出流编码 与控制台编码根据环境配置 不一定相同.
我们通过decode(),encode() 进行编码转换 只需要将初始编码(代码文件编码) 转换为最终编码(控制台编码)即可正常显示. 输出流编码, 对这一转换过程没有太大影响.

import locale
print locale.getpreferredencoding()

locale.getpreferredencoding() 可以获得控制台最终编码

因此 得出python 中文编码转换 优化方案

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 输出流编码转化
import sys
import locale
  
class UnicodeStreamFilter:  
    def __init__(self, target):  
        self.target = target  
        self.encoding = 'utf-8'  
        self.errors = 'replace'  
        self.encode_to = locale.getpreferredencoding()
    def write(self, s):  
        if type(s) == str:  
            s = s.decode("utf-8")  
        s = s.encode(self.encode_to, self.errors)
        self.target.write(s)  
          
# if locale.getpreferredencoding() == 'cp936':
sys.stdout = UnicodeStreamFilter(sys.stdout)

你可能感兴趣的:(python)