【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码
转自:http://www.crifan.com/python_already_got_correct_encoding_string_but_seems_print_messy_code/
【背景】
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,之间的逻辑,转换,和区别。
不了解的,也要先去看:
【整理】Python中字符编码的总结和对比:Python 2.x的str和unicode vs 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 |
其中,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 |
即:
之前直接输入中文字符所得到的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 |
所以,总结此问题:
IDLE中输入中文字符,但是显示出来的是类似于’\xd6\xd0\xce\xc4’的值,而不是想要的中文字符
的答案就是:
其实本身已经是中文字符。
只是根据当前默认是GBK编码,所显示出来的GBK编码的内部的值而已。
其实,对此问题,更加终极的解决办法是:
由于IDLE不是很好用,所以不推荐用户,尤其是初学者,直接就用IDLE来开发Python。
而是推荐你用:
Notepad++ 加 cmd
具体的原因和解释,详见:
【整理】【多图详解】如何在Windows下开发Python:在cmd下运行Python脚本,如何使用Python Shell(command line模式和GUI模式),如何使用Python IDE
更更终极的办法是:
这类常见的错误,属于学习Python中所容易走的弯路。
而你要是按照我的教程去学习,不仅可以少走很多弯路,而且更容易明白很多基本的逻辑:
初级的:
中级的:
高级专题阐述:
常见问题:中文字符打印输出显示到命令行(Windows的cmd)显示乱码
和上面的现象类似的一个现象就是:
当用python代码,打印输出一个中文字符到命令中,结果却显示乱码。
(1)用如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#!/usr/bin/python # -*- coding: utf-8 -*- """ ------------------------------------------------------------------------------- [Function] 【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码 [Date] 2013-07-19 [Author] Crifan Li [Contact] ------------------------------------------------------------------------------- """ #---------------------------------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。
不了解的,详见:
【整理】Python中用encoding声明的文件编码和文件的实际编码之间的关系
(2)当前代码下载(右键另存为):
(3)还原现象
运行的结果是:
(4)解释
代码中已经解释的很清楚了。
不再啰嗦。
相关帖子
和此类的,python的字符串编码方面的相关内容,之前有更多的总结:
【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法
【整理】关于Python 3.x 中自动识别字符串编码,并正确在cmd中输出的各种情况的测试
【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码的更多相关文章
- 归纳整理Python中的控制流语句的知识点
归纳整理Python中的控制流语句的知识点 Python 解释器在其最简单的级别,以类似的方式操作,即从程序的顶端开始,然后一行一行地顺序执行程序语句.例如,清单 1 展示了几个简单的语句.当把它们键 ...
- Python中读取txt文本出现:SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape问题解决
windows中的路径是反斜杠\,然而反斜杠\在python中有着转义字符的意义,所以在py文件中写windows文件路径的时候,要特别注意反斜杠\的使用. 下面有三种解决方式: 方式一:转义的方式 ...
- 剖析和解决Python中网络粘包的正确姿势
目录 1.粘包及其成因 1.1.粘包产生 1.2.粘包产生的原因 2.尝试解决粘包 2.1.指定数据包的长度 2.2.固定数据包的长度 2.3.用函数实现多次调用发送数据 3.解决粘包问题的正确姿势 ...
- Python学习笔记(迭代、模块扩展、GUI 、编码处理等)
PythonIDLE中的编码处理 http://www.tuicool.com/articles/NbyEBr 原文标题:Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来 ...
- Python中的args和kwargs
有时,你会看到python中定义函数的时候带有两个奇怪的参数:*args.**kwargs.如果你曾经想知道它们是干什么的,或者想知道你的IDE为什么在main()函数中定义它们,那么本文可以帮助到你 ...
- 理解Python中的装饰器
文章先由stackoverflow上面的一个问题引起吧,如果使用如下的代码: @makebold @makeitalic def say(): return "Hello" 打印出 ...
- 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档
转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...
- Python中GBK, UTF-8和Unicode的编码问题
编码问题,一直是使用python2时的一块心病.几乎所有的控制台输入输出.IO操作和HTTP操作都会涉及如下的编码问题: UnicodeDecodeError:‘ascii’codec can’t d ...
- Python中通过多个字符分割(split)字符串的方法
python中字符串自带的split方法一次只能使用一个字符对字符串进行分割,但是python的正则模块则可以实现多个字符分割 import re re.split('-|_','sharejs_ha ...
随机推荐
- 物理像素,ppi,逻辑分辨率和物理分辨率
1 明确几个概念: 物理像素:屏幕物理像素 屏幕像素密度ppi:pixels per inch,屏幕上每英寸可以显示的像素点的数量,即屏幕像素密度.顺便一提,ppi就是dpi,只不过有文章里说苹果喜欢 ...
- db2字符串截取方法及常用函数
select substr(index_code, 1, locate('-', index_code)-1) from report_data substr(str,m,n)表示从str中的m个字符 ...
- JavaSript模块规范 - AMD规范与CMD规范介绍 (转)
JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问题 ...
- 解魔方的机器人攻略17 – 魔方CFOP算法
由 动力老男孩 发表于 2010/01/03 17:38:09 本来我想把这个攻略做成一个NXT开发的教程,把传感器,电机,发声等部分都介绍一遍.不过现在看来有些同学很心急,希望早点看到“核心代码”, ...
- Android使用FFMpeg实现推送视频直播流到服务器
背景 在过去的2015年中,视频直播页的新宠无疑是户外直播.随着4G网络的普及和覆盖率的提升,主播可以在户外通过手机进行直播.而观众也愿意为这种可以足不出户而观天下事的服务买单.基于这样的背景,本文主 ...
- Android自定义View(二)
前言 魅族手机的闹钟应用中有个倒计时,这个控件还是蛮有趣的.左边是魅族闹钟,右边是我们最终实现的效果,虽然有些细节还需优化,不过基本上已经达到了想要的效果,我们先来就来看看如何实现吧. 分析 确定宽高 ...
- IIS Express HTTP 错误 500.22
错误描述: HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 最可能的原因: 此应用程序在 system.we ...
- JAVA常见算法题(一)
package com.xiaowu.demo; // 有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第四个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少? /** * ...
- Android控件之GridView探究
GridView是一项显示二维的viewgroup,可滚动的网格.一般用来显示多张图片. 以下模拟九宫图的实现,当鼠标点击图片时会进行相应的跳转链接. 目录结构 main.xml布局文件,存放Grid ...
- util.select.js
ylbtech-JavaScript-util: util.select.js 筛选工具 1.A,JS-效果图返回顶部 1.B,JS-Source Code(源代码)返回顶部 1.B.1, m.y ...