python cmd 窗口 中文乱码 解决方法 (附:打印不同颜色)
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 窗口 中文乱码 解决方法 (附:打印不同颜色)的更多相关文章
- 【IntellJ IDEA】idea的Terminal窗口中文乱码 解决方法
在操作git命令在windows上的idea中的terminal窗口时,总是出现中文乱码的问题 本开始以为是git乱码的问题,如果是GIt中文乱码,解决方案:https://www.cnblogs.c ...
- python 写入JSON中文乱码解决方法
在将一个字典添加入json中时多加入一个参数就可以了 json.dumps(dict(item), ensure_ascii=False) 例子 with open('zh-cn.json','w', ...
- 使用WebLogic时控制台输出中文乱码解决方法
使用WebLogic时控制台输出中文乱码解决方法 1.找到weblogic安装目录,当前项目配置的domain 2.找到bin下的setDomainEnv.cmd文件 3.打开文件,从文件最后搜索第一 ...
- php mysql 中文乱码解决方法
本文章向码农们介绍php mysql 中文乱码解决方法,对码农们非常实用,需要的码农可以参考一下. 从MySQL 4.1开始引入多语言的支持,但是用PHP插入的中文会出现乱码.无论用什么编码也不行 解 ...
- jquery的ajax()函数传值中文乱码解决方法介绍
jquery的ajax()函数传值中文乱码解决方法介绍,需要的朋友可以参考下 代码如下: $.ajax({ dataType : ‘json', type : ‘POST', url : ‘http: ...
- [转]mysql导入导出数据中文乱码解决方法小结
本文章总结了mysql导入导出数据中文乱码解决方法,出现中文乱码一般情况是导入导入时编码的设置问题,我们只要把编码调整一致即可解决此方法,下面是搜索到的一些方法总结,方便需要的朋友. linux系统中 ...
- Zxing中文乱码解决方法
Zxing中文乱码解决方法总结 尝试过非常多方法 最后发现此方法解决的乱码最多....... 在百度搜索二维码图片 经过前2页的測试 除开一张图之外 其余都能扫描出结果 假设大家有更好的解决方法 ...
- unity3d 中文乱码解决方法——cs代码文件格式批量转化UTF8
在Unity3d中经常会碰到中文乱码的问题,比如代码中的[AddComponentMenu("GameDef/AI/战机AI")],注释,中文文本等等 其原因在于,unity本身是 ...
- Codeblocks中文乱码解决方法
odeblocks中文乱码解决方法: 特别提示:出现中文乱码情况才执行以下操作,未出现请勿随意修改!!!! 打开Codeblocks -> 设置 -> 编辑器: 然后点击 Encoding ...
随机推荐
- golang web框架 beego 学习 (七)json转数组
Modules type User struct { Id int64 `json:"id"` Name string `json:"name"` Email ...
- 【miscellaneous】关于gst ffmpeg插件的安装心得
1 一直通过软件源不能将ffmpeg插件进行安装 2 下载源码编译一直失败 说是需要依赖bad插件 3 bad插件安装不上在ubuntu下 解决办法: 应该直接查找ffmpeg插件的安装办法,不是只有 ...
- Nginx+PHP(FastCGI)高性能服务器加载redis+memcache模块
1)Nginx+FastCGI安装配置: yum install openssl openssl-devel pcre-devel pcre zlib zlib-devel –y #下载Nginx源 ...
- boost::bind四种应用场景的例子
普通函数 int f( int a, int b ){return a + b;}boost::bind( f, _1, 9 )( 1 ) 成员函数 struct demo{int f( in ...
- SpringBoot中使用 RabbitMQ -测试
本章主要建立在已经安装好Erlang以及RabbitMQ的基础上,接下来,简单介绍一下使用 1.首先到RabbitMQ的管理界面新建一个队列(Direct模式) 2.测试项目的基础结构如下: 这里为了 ...
- CNN-1: LeNet-5 卷积神经网络模型
1.LeNet-5模型简介 LeNet-5 模型是 Yann LeCun 教授于 1998 年在论文 Gradient-based learning applied to document ...
- [转帖]可能是东半球最好的 Curl 学习指南,强烈建议收藏!
可能是东半球最好的 Curl 学习指南,强烈建议收藏! http://www.itpub.net/2019/09/30/3302/ 记得转帖过.. 简介 curl 是常用的命令行工具,用来请求 Web ...
- C++:链表(有头链表)
介绍 把链表分为无头链表和有头链表. 无头链表:所有的节点都包含了有效数据,上一篇文章中演示代码使用的就是无头链表. 有头链表:用一个固定的头节点来指代整个链表,所有的对象都挂在这个头节点下面,而头节 ...
- zabbix硬件监控以及服务
大家好今天给大家带来zabbix3.4.8监控主机,那么最近由于我个人的关系.没有及时的更新文章所以,很抱歉那么今天我分享的内容是zabbix3.4.8监控服务器.本章的具体监控服务器如下: 服务器的 ...
- c++学习(三)------static数据与成员函数
疑惑: static类型成员是类的全局变量,所有类的实例都享有这个变量,或者说这个变量不属于任何一个类的实例. static类型变量可以为private,或public或其他(static数据可以被继 ...