我在学python的过程中,遇到的第二个问题,就是中文乱码,如今也算勉强入门了,在这里给大家说说我的经验,也算个新人引导吧。

 
 
在文章里,我会重点提到一个概念:有来有去。
即数据从哪里来,到哪里去?
 
====================================================
1、windows下cmd终端中的中文
C:\Documents and Settings\admin>python
Python 2.7.7 (default, Jun 1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '我是中文'
>>> ss = u'我真的是中文'
>>> s
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
>>> ss
u'\u6211\u771f\u7684\u662f\u4e2d\u6587'
>>> print s
我是中文
>>> print ss
我真的是中文
>>>
这样看来,输入和输出都不会出现乱码的,即使我们的字符串加了u。
        1)输入从哪里来?
                终端
        2)输入是什么编码?
                一个不知道,一个是unicode
        3)输出是什么编码?
                不知道
 
2.、windows下cmd中执行py文件
    我们先来看看代码 test.py
#coding:utf-8
 
s = 'abc我是中文字符串'
 
ss = u'我也是中文字符串'
 
print s
 
print repr(s)
 
print ss
 
print repr(ss)
文件是以utf8 withour BOM形式存在的(后面我们再来讨论文件编码)。
我们在cmd终端中执行看看
D:\code>python test.py
abc鎴戞槸涓枃瀛楃涓
'abc\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
我也是中文字符串
u'\u6211\u4e5f\u662f\u4e2d\u6587\u5b57\u7b26\u4e32'
 
D:\code>
天啊,怎么会有乱码,怎么能有乱码!!我快疯了。
stop,先别疯,我们来一步一步分析:
    1)输入从哪里来?
            废话,从文件里来
    2)输入是什么编码?
            这个,好像一个是utf8,一个是unicode
    3)输出是什么编码?
            不知道哎,不是utf8么?
是不是看出一点点问题了?
utf8      ------>   输出编码             ---------> 出现乱码
unicode ------>   输出编码             ---------> 不出现乱码
那么那么,在文字输出之前,我们先转换为unicode,再输出,是不是就不会有乱码了呢?我们来试一试
#coding:utf-8
 
s = 'abc我是中文字符串'
 
ss = u'我也是中文字符串'
 
print s
 
print repr(s)
 
# 其它字符串解码成unicode
uu = s.decode('utf-8')
 
print uu
 
print repr(uu)
 
print ss
 
print repr(ss)
看看执行结果
D:\code>python test.py
abc鎴戞槸涓枃瀛楃涓
'abc\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
abc我是中文字符串
u'abc\u6211\u662f\u4e2d\u6587\u5b57\u7b26\u4e32'
我也是中文字符串
u'\u6211\u4e5f\u662f\u4e2d\u6587\u5b57\u7b26\u4e32'
 
D:\code>
果然没有乱码了。
看样子终于是解决了一点问题,但是,远远不够,因为我们还可能遇到其它的问题。
 
3、windows下cmd中与用户交互
为了应对各种环境,我们的代码会遭遇各种问题?
比如写好的代码可能会在cmd中执行,可能在idle中执行,也可能在linux下执行,我们要尽可能的控制程序按照我们的意愿来工作,第一个就是不出现乱码。
    假如我们现在有一个代码文件,需要用户的输入,我们在cmd中执行,我们需要明确的知道一点,我们输入的编码是什么?
    只有知道输入的编码是什么?才能进行解码成unicode,才能不出现乱码。
    那么,在cmd中,输入的编码是什么?
在这之前,我们先来学习下decode和encode
    1)decode 解码,在已知字符串编码的情况下,转码为unicode  ,比如  s.decode('utf-8'),结果为unicode
    2)encode 编码,在已有unicode的情况下,转码为其它编码,比如  u.encode('utf-8'),结果为utf-8
 
我只要说一点,你就懂了
sys.stdin.encoding
当然了,与之对应的是
sys.stdout.encoding
 
还是看看代码吧:
#coding:utf-8
 
import sys
 
s = raw_input()
 
print s
print repr(s)
 
u = s.decode(sys.stdin.encoding)
 
print u
print repr(u)
 
o = u.encode(sys.stdout.encoding)
 
print o
print repr(o)
cmd中运行
D:\code>python test.py
我是中文
我是中文
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
我是中文
u'\u6211\u662f\u4e2d\u6587'
我是中文
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
 
D:\code>
idle中运行
Python 2.7.7 (default, Jun 1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
我是中文
我是中文
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
我是中文
u'\u6211\u662f\u4e2d\u6587'
我是中文
'\xce\xd2\xca\xc7\xd6\xd0\xce\xc4'
>>>
linux中运行
root@kali:~/Desktop# python test.py
我是中文
我是中文
'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87'
我是中文
u'\u6211\u662f\u4e2d\u6587'
我是中文
'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87'
 
 
总结:
如果你知道你从哪里来,要到哪里去,你一定会到达那个地方。

python 中文编码(一)的更多相关文章

  1. [Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

    最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下 ...

  2. python中文编码问题深入分析(一):字符编码基础

    背景:笔者作为一名刚接触python语言的新手,在实际的项目中,遇到过一些中文编码问题,初次遇到这些问题的时候,刚开始显得有些手足无措,也不知从何查起.常言道:有问题,找度娘!当我打开www.baid ...

  3. python - 中文编码/ASCII

    Python 中文编码 为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5.    GB2312(1980年)一共收录了7445个字符,包括6763个汉子和682个其他符号. ...

  4. 转:解决Python中文编码问题

    Python 文本挖掘:解决Python中文编码问题 转于:http://rzcoding.blog.163.com/blog/static/2222810172013101785738166/   ...

  5. python中文编码 - python基础入门(5)

    python到目前为止,一共有两个版本,分别是2.x和3.x版本,根据官方正式通知2020年停止对python更新和维护,距离今天还有110天左右,所以正在学习python的小伙伴应该暗中庆幸一波. ...

  6. python中文编码

    前面章节中我们已经学会了如何用 Python 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"就有可能会碰到中文编码问题 ...

  7. 【转】【Python】Python 中文编码报错

    用 Python 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符"你好,世界"就有可能会碰到中文编码问题. Python 文件中如果 ...

  8. Python中文编码过程中遇到的一些问题

    首先,要明确encode()和decode()的差别 encode()的作用是将Unicode编码的字符串转换为其它编码格式. 比如:st1.encode("utf-8")  这句 ...

  9. Python中文编码问题(字符串前面加'u')

    中文编码问题是用中文的程序员经常头大的问题,在python下也是如此,那么应该怎么理解和解决python的编码问题呢? 我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各 ...

  10. 【原创】python中文编码问题深入分析(三):python2.7文件读写中文编码问题

    上一篇文章介绍和分析了python2.7中使用print遇到的中文编码问题的原因和解决方案,本篇主要介绍一下python2.7中执行文件读写可能遇到的编码问题. 1.文件读取 假如我们读取一个文件,文 ...

随机推荐

  1. JAVA删除文件及文件夹

    JAVA在删除文件或文件夹时,在java.io.File类下有个delete的方法,并且可以返回true or false, 用这个方法来删除单个文件时,很好使,但在删除文件夹时,如果文件夹下面有文件 ...

  2. iphone 恢复出厂设置方法

    1.下载安装并打开itunes. 2.让手机进入恢复模式: 一.先长按住电源键,出现关机选项时,请滑动关机: 二.随后再按电源键开机,屏幕会出现苹果标志,不要松开电源键: 三.接着再按住主屏 Home ...

  3. 进阶之路(基础篇) - 021 arduino基础知识

    什么是arduino(翻译自arduino官方介绍)Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).她适用于艺术家. ...

  4. 【Linux】进程优先级、进程nice值和%nice

    用top或者ps命令会输出PRI/PR.NI.%ni/%nice这三种指标值,这些到底是什么东西?先给出大概的解释如下: PRI :进程优先权,代表这个进程可被执行的优先级,其值越小,优先级就越高,越 ...

  5. Linux日期时间显示输出

    1.输出当前年月日 echo $(date +%F) 2014-02-21 2.输出当前时间(时分) echo $(date +%R) 12:45 3.输出当前时间(时分秒) echo $(date ...

  6. rhel7 ifconfig command not found

    同事扔过来一个rhel7.2的系统,登录后发现没有安装ifconfig命令: # ifconfig -bash: ifconfig: command not found 先看看环境变量: # echo ...

  7. CListCtrl选中某行

    原文链接: http://blog.csdn.net/wxq1987525/article/details/7461461 1.设置CListCtrl选中行 m_list.SetItemState( ...

  8. stm32定时器PWM模式和输出比较模式

    pwm模式是输出比较模式的一种特例,包含于输出比较模式中 /** @defgroup TIM_Output_Compare_and_PWM_modes * @{ */ #define TIM_OCMo ...

  9. Java – How to convert a primitive Array to List

    Java – How to convert a primitive Array to ListCode snippets to convert a primitive array int[] to a ...

  10. python 取整的两种方法

    问题简介: 要把一个浮点数(float)整数部分提取出来.比如把“2.1”变成“2”的这一过程:现在我们给这个过程起一个名字叫“取整”.那么它 在python中大致可以有两种写法 写法1)类型转换: ...