python输出中文——如何在Windows控制台打印不乱码

文章介绍

用Python在控制台打印中文如何不会乱码,一直是困扰很多Pythoner的问题,甚至很多Python老手也经常犯难。原因就在于从一般网页、数据库或文本外来数据源上抓取过来的内容,需要经过正确的编解码才可以正常输出,而Python的编解码机制比较复杂,没有深入思考的话经常遇到调试错误。这篇文章介绍了最常见的几种输出中文的情况,编译平台为Windows控制台,Python版本为2.7.9

文章中一些内容参考了点击打开链接 感谢原作者分享。

预备知识

str和unicode

首先需要弄清楚str和unicode的区别。str是字节串,由unicode经过编码(encode)后的字节组成的。unicode才是真正意义上的字符串,由字符组成。在编程过程中,必须搞明白要处理的是str还是unicode, 使用对的处理方法(str.decode/unicode.encode)。一个简单的原则是:不要对str使用encode,不要对unicode使用decode(事实上str可以使用encode的,但不建议这么做,这里就不再赘述了。

用下面的代码判断是否为unicode/str:

<pre name="code" class="python">-*- coding=utf-8 -*-
isinstance(u'哈哈你好', unicode)
isinstance('哈哈你好',str)

打印结果均为True。

utf-8还是gbk

这两种都是中文的编码方式,选择其中哪一种都可以,但要注意的是必须同一项目中都统一使用,不能混合使用。

头部声明coding=utf-8, a = ‘中文‘ 其编码为utf-8

若头部声明coding=gb2312, a = ‘中文‘ 其编码为gbk

同一项目中所有源文件头部统一一个编码,并且声明的编码要和源文件保存的编码一致(编辑器相关)

PS:在源代码用作处理的硬编码字符串,统一用unicode

将其类型和源文件本身的编码隔离开, 独立无依赖方便流程中各个位置处理。

代码实现

1. 最简单的情况,直接在代码行输出中文,即中文字符串不是保存在变量里的,如下即可实现:

print u'哈哈你好'

这里是把中文字符串‘哈哈你好‘解码成unicode字符串了,如果直接print ‘哈哈你好‘则会显示乱码

2. 如果中文字符串是保存在字符串变量里,则 按照下面的方式实现:

string='哈哈你好'
print string.decode('UTF-8')

原理其实是跟第一种情况一样的,把中文字符串‘哈哈你好‘解码成unicode字符串了

3. 再复杂一点,中文字符串是保存在元组、列表或者字典里应该怎么输出呢?因为只有str对象才能调用decode方法,tuple/list/dict调用decode会报错,或许你会说把这些对象转换成str对象再调用decode,但那样很麻烦且程序效率不高。可以调用json模块的dumps方法,如下:

tuple=('哈哈','你好')
list=['哈哈','你好']
dict={1:'哈哈',2:'你好'}
print json.dumps(tuple,encoding='UTF-8',ensure_ascii=False)
print json.dumps(list,encoding='UTF-8',ensure_ascii=False)
print json.dumps(dict,encoding='UTF-8',ensure_ascii=False)

要注意dumps方法里的两个参数

完整代码和打印结果

# -*- coding:UTF-8 -*-
###测试python输出中文是否乱码
import json

print u'哈哈你好'

string='哈哈你好'
print string.decode('UTF-8')

tuple=('哈哈','你好')
list=['哈哈','你好']
dict={1:'哈哈',2:'你好'}
print json.dumps(tuple,encoding='UTF-8',ensure_ascii=False)
print json.dumps(list,encoding='UTF-8',ensure_ascii=False)
print json.dumps(dict,encoding='UTF-8',ensure_ascii=False)

在Windows控制台运行Python程序,输出结果为:

5种类型的中文输出均可以不乱码显示。

关于Python输出中文还有很多原理性的东西需要弄明白,而且编译平台和Python版本不同可能也会不太一样,不过大体方法都是类似的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 16:07:35

python输出中文——如何在Windows控制台打印不乱码的相关文章

Python输出中文到文件时的字符编码问题

今天在使用Python的GUI平台wxPython时,写了一个只有打开.编辑.保存功能的简易笔记本,代码如下: 1 #coding:utf-8 2 import wx 3 4 def load(event): 5 f = open(FileName.GetValue()) 6 Contents.SetValue(f.read()) 7 f.close() 8 9 def save(event): 10 f = open(FileName.GetValue(), 'w') 11 f.write(C

python:连接Oracle数据库后控制台打印中文为??

打印查询结果,中文显示为了??? [('72H FCR', '2.0'), ('?????', '8.0')] E:\Python35\Lib\site-packages中新增文件: sitecustomize.py import os os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8' 原文地址:https://www.cnblogs.com/gcgc/p/11526420.html

Ubuntu下,python输出中文

python教程里说,如果要输出非英语文本就加前缀u或U, 例如: print u"你好啊,祖国" print u"こんにちは.私はとてもいいです" 结果会报错:SyntaxError: Non-ASCII character '\xe4' in file...... 解决的方法是: #!/usr/bin/python#coding:utf-8print "こんにちは.私はとてもいいです"print "这是中文,哈哈哈" 或者

win10下使用vscode调试python输出中文乱码的解决办法

今天在vscode中调试一个python脚本时发现中文乱码了,折腾了好一会儿才找到原因,记录一下. 很简单的一句代码测试一下: # -*- coding: utf-8 -*- print('乱码不?') 文件编码设置的也是utf-8,但是调试就是乱码,网上看大都是说设置PYTHONIOENCODING=UTF8的环境变量,尝试过发现还是不行. 其实问题在于windows下的cmd或者PS终端都是默认GBK编码,VSCODE调试时是调用的cmd的,如果把文件头和编码都改成GBK就不会乱码了,但是考

Python输出中文乱码问题

//建立一个文件test.txt,文件格式用ANSI,内容为: //abc中文 //用python来读取 # coding=gbk print open("Test.txt").read() //结果:abc中文 //把文件格式改成UTF-8: //结果:abc涓枃 //显然,这里需要解码: # coding=gbk import codecs print open("Test.txt").read().decode("utf-8") //结果

python输出中文

添加 # encoding: utf-8 到你的 python脚本第一行

4.1. 如何在Windows环境下开发Python

4.1. 如何在Windows环境下开发Python 4.1. 如何在Windows环境下开发Python 4.1.1. Python的最原始的开发方式是什么样的 4.1.1.1. 找个文本编辑器,新建个.py文件,写上Python代码 4.1.1.2. 打开Windows的cmd,并且切换到对应的python脚本所在目录 4.1.1.2.1. 方法1:手动打开cmd,并cd到对应路径 4.1.1.2.2. 方法2:通过Notepad++的Open current dir cmd 4.1.1.3

【原创】python中文编码问题:控制窗口能输出中文,到文本文件里乱码

遇到一个问题:控制窗口能正常输出中文,>到文本文件里却是乱码.最后解决了,总结一下Python中文编码的坑. 开始感觉非常奇怪,想第一行为什么是正常的?之后注意到文本文件为ANSI编码,第一行在代码里面是字符串的形式输出来的,而且代码的文本格式也为ANSI. 后面不正常的数据是在列表用utf-8编码输出来的.开始想把第一行用utf-8输出来,把代码改为s.decode('gbk').encode('utf-8') ,发现结果还是不行.因为直接输入的字符串是按照代码文件的编码来处理的. 之后把列表

如何实现在python2.x上输出中文

python3.x输出中文 因为python3.x支持中文,所以可以直接输出,不需要注明编码格式 #Author:liu name = "你好,世界" print(name ) 输出: python2.x输出中文 在使用python输出中文时,需要注明编码格式 #-*-coding:utf-8-*- #Author:liu name = "你好,世界" print(name ) 注意这里的字符编码格式必须要写在第一行(#--coding:utf-8--写在第一行)输