前言: 本文简述了python编码的转换过程. (3.)最后的代码块是编码转换的最终方案.实测在win控制台 和 vscode控制台调试下 皆可正常显示中文
# -*- coding: utf-8 -*-
设置了代码所用编码
注意:这行代码 只是告诉计算机 我当前所用编码, 并没有对编码进行转换 .实际编码 取决于保存文档时 设置的编码.
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)下,仍然存在乱码问题.
这说明输出流编码,仍不是控制台最终编码.
字符串 从代码 导成 输出流, 最后在控制台呈现,正确转换流程是:
代码文件编码 -> 输出流编码 -> 控制台编码
输出流编码 与控制台编码根据环境配置 不一定相同.
我们通过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)