python cmd 窗口 中文乱码 解决方法 (附:打印不同颜色)

前言

在 python 开发中,有时候想通过cmd窗口来和用户交互,比如显示信息之类的,会比自己创建 GUI 来的方便,但是随之而来的就是编码乱码问题

下面例子在 python2 和 python3 中都可以运行,也可以在其它 .py 中通过 import os;os.startfile(ur"xxx.bat") 来运行

之前一直遇到一个问题,通过双击 bat 文件来运行,可以不用转码,只要 cmd 窗口的活动页编码是 936 就可以了,但是在其它 py 文件中运行那个 bat,就会出现乱码,所以转码后可以一保正常

双击 .bat 来运行 py

@echo off
chcp 936>nul
python d:\test.py
exit
# -*- coding: utf-8-*-

import sys
import os input_ = input
zh_coding = 'cp936'
utf_8 = 'utf-8' # before other codes
if sys.version_info.major < 3:
reload(sys)
sys.setdefaultencoding(utf_8) input_ = raw_input # begin your code def to936(utf8):
if sys.version_info.major < 3:
utf8 = utf8.decode().encode(zh_coding)
return utf8 def toUtf8(zh936):
if sys.version_info.major < 3:
zh936 = zh936.decode(zh_coding).encode(utf_8)
return zh936 os.system('@echo off')
# 转换cmd窗口的编码集,不管cmd窗口的默认值是什么都显示正确
os.system('chcp 936 >nul') print(to936(u'中文简体(encoding)'))
print(to936(u'中文繁體(encoding)')) # 在 cmd 窗口 的默认值的默认代码页不是 936 的情况下会报错。
# 如果是 936,通过双击 .bat 运行是正常的,
# 如果在其它 py 中通过 os.startfile(), subprocess, os.system()
# 等模块来运行那个bat,会显示乱码
try:
print(u'中文简体(not encoding)')
print(u'中文繁體(not encoding)')
except Exception as e:
os.system(to936(u'echo 解码错误'))
print(e) i = input_(to936(u'输入你的中文名字:'))
i = toUtf8(i)
msg = to936(u'你的中文名字是:%s' % i)
print(msg) os.system('pause && exit')

打印不同颜色

win 的 cmd 终端也可以像linux的终端一样,打印不同行颜色,同一行不同颜色

这里有个个方法:https://www.cnblogs.com/linyfeng/p/8286506.html#4304331

不过,在我使用 waf 的过程中,发现 waf 在win cmd 窗口打印颜色更全面更通用的模块,使用方法和linux的一致

waf 是开源的,我从里面提取了相关的模块,可以集成到自己 lib 中,waf 教程和下载:https://waf.io/book/

而且,使用 waf 的模块,在 python 2 中只是print 的时候,不用转码,但是input的时候还是要转回utf-8

waf 从 git 上下载的 waflib 兼容 python 2 和 3

waflib模块中提取的文件(注意,这些文件的编写,语法缩进是 tab,而不是四个空格,所以最好自己把 tab 替换成四个空格,不然通过编译出来的 pyc 可能不能用):

__init__.py

ansiterm.py

Errors.py

Utils.py

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

import sys
import os input_ = input
zh_coding = 'cp936'
utf_8 = 'utf-8' # before other codes
if sys.version_info.major < 3:
reload(sys)
sys.setdefaultencoding(utf_8) # begin your code ################################################### from waflib import ansiterm if not os.environ.get('NOSYNC',False):
if sys.stdout.isatty()and id(sys.stdout)==id(sys.__stdout__):
sys.stdout=ansiterm.AnsiTerm(sys.stdout)
if sys.stderr.isatty()and id(sys.stderr)==id(sys.__stderr__):
sys.stderr=ansiterm.AnsiTerm(sys.stderr) os.system('@echo off')
# 转换cmd窗口的编码集,不管cmd窗口的默认值是什么都显示正确
os.system('chcp 936 >nul') # 颜色
print(u'\033[32m绿色\033[31m红色\033[0m') print(u'中文简体(not encoding)')
print(u'中文繁體(not encoding)') os.system('pause && exit')

上面没有 input 例子,如果要用,参考上上个例子

主要添加了以下代码,之后 print 就像通用的一样使用就可以了

from waflib import ansiterm

if not os.environ.get('NOSYNC',False):
if sys.stdout.isatty()and id(sys.stdout)==id(sys.__stdout__):
sys.stdout=ansiterm.AnsiTerm(sys.stdout)
if sys.stderr.isatty()and id(sys.stderr)==id(sys.__stderr__):
sys.stderr=ansiterm.AnsiTerm(sys.stderr)

print 颜色 格式参考:https://www.cnblogs.com/pupilheart/p/9704943.html

python cmd 窗口 中文乱码 解决方法 (附:打印不同颜色)的更多相关文章

  1. 【IntellJ IDEA】idea的Terminal窗口中文乱码 解决方法

    在操作git命令在windows上的idea中的terminal窗口时,总是出现中文乱码的问题 本开始以为是git乱码的问题,如果是GIt中文乱码,解决方案:https://www.cnblogs.c ...

  2. python 写入JSON中文乱码解决方法

    在将一个字典添加入json中时多加入一个参数就可以了 json.dumps(dict(item), ensure_ascii=False) 例子 with open('zh-cn.json','w', ...

  3. 使用WebLogic时控制台输出中文乱码解决方法

    使用WebLogic时控制台输出中文乱码解决方法 1.找到weblogic安装目录,当前项目配置的domain 2.找到bin下的setDomainEnv.cmd文件 3.打开文件,从文件最后搜索第一 ...

  4. php mysql 中文乱码解决方法

    本文章向码农们介绍php mysql 中文乱码解决方法,对码农们非常实用,需要的码农可以参考一下. 从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行 解 ...

  5. jquery的ajax()函数传值中文乱码解决方法介绍

    jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...

  6. [转]mysql导入导出数据中文乱码解决方法小结

    本文章总结了mysql导入导出数据中文乱码解决方法,出现中文乱码一般情况是导入导入时编码的设置问题,我们只要把编码调整一致即可解决此方法,下面是搜索到的一些方法总结,方便需要的朋友. linux系统中 ...

  7. Zxing中文乱码解决方法

    Zxing中文乱码解决方法总结 尝试过非常多方法  最后发现此方法解决的乱码最多....... 在百度搜索二维码图片 经过前2页的測试  除开一张图之外  其余都能扫描出结果 假设大家有更好的解决方法 ...

  8. unity3d 中文乱码解决方法——cs代码文件格式批量转化UTF8

    在Unity3d中经常会碰到中文乱码的问题,比如代码中的[AddComponentMenu("GameDef/AI/战机AI")],注释,中文文本等等 其原因在于,unity本身是 ...

  9. Codeblocks中文乱码解决方法

    odeblocks中文乱码解决方法: 特别提示:出现中文乱码情况才执行以下操作,未出现请勿随意修改!!!! 打开Codeblocks -> 设置 -> 编辑器: 然后点击 Encoding ...

随机推荐

  1. C# checked和unchecked 关键字详解

    checked 和 unchecked关键字用来限定检查或者不检查数学运算溢出的:如果使用了checked发生数学运算溢出时会抛出OverflowException:如果使用了unchecked则不会 ...

  2. vue中的$listeners属性作用

    一.当组件的根元素不具备一些DOM事件,但是根元素内部元素具备相对应的DOM事件,那么可以使用$listeners获取父组件传递进来的所有事件函数,再通过v-on="xxxx"绑定 ...

  3. PyCharm Community Edition编辑Python查看数据库

    描述:利用PyCharm Community Edition社区版本的时候无法查看数据库 解决方法如下: 点击File之后选择setting 点击setting之后出现的画面上面选择Plugins,之 ...

  4. Java基础---Java变量

    变量:程序运行期间,内容可以发生改变的量. 创建一个变量并且使用的格式: 数据类型 变量名称;         // 创建了一个变量 变量名称 = 数据值;           // 赋值,将右边的数 ...

  5. Win10 鼠标右键新建菜单添加自定义文件

    1. 引言 在鼠标右键(右单机)新建菜单中添加自定义文件,例如:写字板,markdown等. 效果图: 2. 操作步骤(以Win10为例) 1. win+R输入regedit进入注册表 2. 这里以添 ...

  6. python笔记007-函数

    昨日简要: 1.文件操作: 1.1获得句柄: f = open(‘one.txt’,mode=’’,encoding=’utf-8’) f = open(‘../’) à返回上一层 f = open( ...

  7. Python标准库之sched模块介绍

    sched——通用时间调度器 sched模块实现了一个通用事件调度器,在调度器类使用一个延迟函数等待特定的时间,执行任务.同时支持多线程应用程序,在每个任务执行后会立刻调用延时函数,以确保其他线程也能 ...

  8. BZOJ4566 HAOI2016找相同字符(后缀自动机)

    对第一个串建SAM,第二个串在上面跑,记录当前前缀匹配的最长后缀长度l,每次考虑当前前缀的贡献,对于当前所在节点显然是|right|*(l-len[fa]),而对于其parent树上所有祖先的贡献显然 ...

  9. (六)发送、接收SOAP消息(1)

    一.为什么要用soap 原本我们使用web服务都是根据wsdl生成客户端(生成一堆java文件)然后再调用,本章节讲解如何用soap消息来替代这种方式. 二.SOAP消息格式 SOAP(简单对象访问协 ...

  10. C++万能头文件<bits/stdc++.h>的内容与优缺点

    最近发现了一个C++的头文件bits/stdc++.h,听说这是一个几乎包含了所有C++库函数的头文件,就想更深入的了解一下,下面是头文件内容 // C++ includes used for pre ...