python无法打印unicode编码_【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码...

本文详细解析了Python在IDLE中显示中文字符为16进制编码以及在Windows cmd命令行中打印中文出现乱码的问题。主要涉及Python的字符编码、IDLE的GBK显示逻辑以及解决这些问题的方法,包括使用decode和encode操作来正确显示中文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【背景】

Python中的字符编码,其实的确有点复杂。

再加上,不同的开发环境和工具中,显示的逻辑和效果又不太相同,尤其是,中文的,初级用户,最常遇到的:

(1)在Python自带的IDE:IDLE中折腾中文字符,结果看到的差不多都是乱码类的东西,比如:’\xd6\xd0\xce\xc4′

(2)将一个中文字符,打印输出到windows的cmd命令行中,看到的是乱码

对此,此处专门整理一下,这些常见的现象,和现象背后的根本原因,以及如何解决这类问题。

背景知识

其实,看下面问题之前,最好是已经了解相关的背景知识,才更容易看懂的:

1.字符编码的基本知识

对于字符编码本身,比如UTF-8,GBK等等,不熟悉的,不了解是啥的话,先去看:

2.Windows的cmd中的默认是GBK编码

这方面不了解的,也需要先去看:

中的:

3.关于IDLE

其实也要先大概了解:

Python内部,默认的字符编码是,是根据操作系统,我们多数都是Windows的中文系统,默认是GBK编码。

而IDLE中,直接输入中文字符,其实就是GBK编码的。

4.Python中的字符串的设计

主要是:Python 2.x中的str和unicode ,和,Python 3.x中的bytes和str,之间的逻辑,转换,和区别。

不了解的,也要先去看:

常见问题:IDLE中看到类似于’\xd6\xd0\xce\xc4’,而不是我想要的中文字符

初学者,最容易遇到的问题就是:

中文用户,用了Python自带的IDLE,在里面输入中文后,结果显示出,类似于:‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

的内容,而不是希望看到输出的中文字符,比如:

此现象的解释是:

实际上,此处你,本身就已经得到了,正确的,默认的GBK编码的,中文字符串:"我是中文"

了。只是:

IDLE这个,Python自带的IDE,不是很好用的IDE,给你显示出来,其内部的16进制的值而已。

1. 对于此点,你可以去用decode去验证一下:Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32

Type "copyright", "credits" or "license()" for more information.

>>> "我是中文"

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

>>> "我是中文".decode("GBK")

u’\u6211\u662f\u4e2d\u6587′

>>>

其中,GBK的字符串,经过解码后,就可以得到Unicode的字符串了,对应的显示出来的是:u’\u6211\u662f\u4e2d\u6587′

此处的:

\u6211,\u662f,\u4e2d,\u6587,分别对应着,四个中文字符:"我","是","中","文"

2. 有人会问,我怎么知道这些值,是对应着这四个中文字符的呢?

答案是:

那是因为你不熟悉Unicode。且也不会去查Unicode表格。

等你看了之前告诉你的:

然后再去参考我的:

去查Unicode值,就可以查到“我”对应的Unicode值是0x6211:

同理,可以查得剩下的:

0x662f="是"=\u662f

0x4e2d="中"=\u4e2d

0x6587="文"=\u6587

3.回到上面的问题,接着,还可以接着进一步验证,之前的字符串,的确是GBK:Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32

Type "copyright", "credits" or "license()" for more information.

>>> "我是中文"

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

>>> "我是中文".decode("GBK")

u’\u6211\u662f\u4e2d\u6587′

>>> "我是中文".decode("GBK").encode("GBK")

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

即:

之前直接输入中文字符所得到的16进制值,和通过GBK解码后得到Unicode,然后再编码为GBK的16进制的值,是一样的

-> 说明之前的中文字符的确是GBK的编码。

4.另外,也可以顺带看看,UTF-8的输出是啥:Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32

Type "copyright", "credits" or "license()" for more information.

>>> "我是中文"

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

>>> "我是中文".decode("GBK")

u’\u6211\u662f\u4e2d\u6587′

>>> "我是中文".decode("GBK").encode("GBK")

‘\xce\xd2\xca\xc7\xd6\xd0\xce\xc4’

>>> "我是中文".decode("GBK").encode("UTF-8")

‘\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87’

所以,总结此问题:

IDLE中输入中文字符,但是显示出来的是类似于’\xd6\xd0\xce\xc4’的值,而不是想要的中文字符

的答案就是:

其实本身已经是中文字符。

只是根据当前默认是GBK编码,所显示出来的GBK编码的内部的值而已。

其实,对此问题,更加终极的解决办法是:

由于IDLE不是很好用,所以不推荐用户,尤其是初学者,直接就用IDLE来开发Python。

而是推荐你用:

Notepad++ 加 cmd

具体的原因和解释,详见:

更更终极的办法是:

这类常见的错误,属于学习Python中所容易走的弯路。

而你要是按照我的教程去学习,不仅可以少走很多弯路,而且更容易明白很多基本的逻辑:

初级的:

中级的:

高级专题阐述:

常见问题:中文字符打印输出显示到命令行(Windows的cmd)显示乱码

和上面的现象类似的一个现象就是:

当用python代码,打印输出一个中文字符到命令中,结果却显示乱码。

(1)用如下代码:#!/usr/bin/python

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

"""

-------------------------------------------------------------------------------

[Function]

【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码

https://www.crifan.com/python_already_got_correct_encoding_string_but_seems_print_messy_code

[Date]

2013-07-19

[Author]

Crifan Li

[Contact]

https://www.crifan.com/about/me/

-------------------------------------------------------------------------------

"""

#---------------------------------import---------------------------------------

#------------------------------------------------------------------------------

def char_ok_but_show_messy():

"""

Demo Python already got normal chinese char, with some encoding, but print to windows cmd show messy code

"""

#此处,当前Python文件是UTF-8编码的,所以如下的字符串,是UTf-8编码的

cnUtf8Char = "我是UTF-8的中文字符串";

#所以,将UTF-8编码的字符串,打印输出到GBK编码的命令行(Windows的cmd)中,就会显示出乱码

print "cnUtf8Char=",cnUtf8Char; #cnUtf8Char= 鎴戞槸UTF-8鐨勪腑鏂囧瓧绗︿覆

#如果想要正确显示出中文字符,不显示乱码的话,则有两种选择:

#1. 把字符串转换为Unicode编码,则输出到GBK的命令行时,Python会自动将Unicode的字符串,编码为GBK,然后正确显示字符

decodedUnicodeChar = cnUtf8Char.decode("UTF-8");

print "decodedUnicodeChar=",decodedUnicodeChar; #decodedUnicodeChar= 我是UTF-8的中文字符串

#2. 让字符串的编码和输入目标(windows的cmd)的编码一致:把当前的字符串(由上述解码后得到的Unicode再次去编码)也变成GBK,然后输出到GBK的命令行时,就可以正确显示了

reEncodedToGbkChar = decodedUnicodeChar.encode("GBK");

print "reEncodedToGbkChar=",reEncodedToGbkChar; #reEncodedToGbkChar= 我是UTF-8的中文字符串

###############################################################################

if __name__=="__main__":

char_ok_but_show_messy();

注意:

此时Python的文件编码是UTF-8。

不了解的,详见:

(2)当前代码下载(右键另存为):

(3)还原现象

运行的结果是:

(4)解释

代码中已经解释的很清楚了。

不再啰嗦。

相关帖子

和此类的,python的字符串编码方面的相关内容,之前有更多的总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值