我在学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. 【C#】Skip和Tack方法实现分页

    int pageIndex = SearchModel.PageIndex <= 0 ? 1 : SearchModel.PageIndex; return BatchInfoList.Skip ...

  2. android开发资源

    android仿微信 http://www.oschina.net/code/snippet_253900_33261

  3. AaronYang的留言板

    ^_^很开心能在这里遇到你,我是ay,英文名叫aaronyang,真名叫杨洋,安徽六安的,有老乡吗?这里的文章几乎都是我原创的,要不然就是收集别人的好的文章,自己再整理下与大家分享.绝对希望原创,本站 ...

  4. golang学习 ----获取URL

    package main import ( "fmt" "io/ioutil" "net/http" "os" ) fu ...

  5. Oracle 12C -- 不同容器之间切换

    1.使用connect SQL> show con_name; CON_NAME ------------------------------ CDB$ROOT SQL> connect ...

  6. C++的字符串格式化库

    这里向大家介绍一个C++的字符串格式化库,叫cpptempl,这个库支持对字符串格式的条件,循环,变量插入.看上去很不错,只不过其是基于boost库的. 下面是一个例子: 1 2 3 4 5 6 7 ...

  7. C++11 中值得关注的几大变化(详解)

    源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里. ...

  8. Linux中断的系统调用

    早期UNIX系统的一个特性是:如果在进程执行一个低速系统调用而阻塞期间捕捉到一个信号,则该系统调用就被中断不再继续执行.该系统调用返回出错,其errno设置为EINTR.这样处理的理由是:因为一个信号 ...

  9. Thinking In Design Pattern——MVP模式演绎

    原文<Thinking In Design Pattern——MVP模式演绎>不知为何丢失了,故重新整理了一遍. 目录 What Is MVP Domain Model StubRepos ...

  10. linux下配置tomcat集群的负载均衡

    linux下配置tomcat集群的负载均衡 一.首先了解下与集群相关的几个概念集群:集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台.在客户端看来,一个集群就象是一个服 ...