一:学习内容

  • 获取更改系统编码
  • 判断字符的编码类型
  • 文件存储和读取的编码

二:获取更改系统编码

1. 获取系统编码

import sys

print sys.getdefaultencoding()

2. 更改系统编码

#encoding=utf-8

import sys

reload(sys)

sys.setdefaultencoding('UTF-8')

print 1,sys.getdefaultencoding()

print 2,type(u"我")

print 3,type("我")

print 4,u"我"

print 5,"我"

print 6,u"我".encode('utf-8')

print 7,u"我".decode('utf-8')

print 8,"我".encode('utf-8').decode('utf-8')

print 9,"我".decode('utf-8').encode('gbk')

print 10,"我".encode('gbk')

运行结果为:

问题一:为什么要reload sys模块

在site.py文件里有这么一段代码:

if hasattr(sys, "setdefaultencoding"):

  del sys.setdefaultencoding

在sys加载后,setdefaultencoding方法被删除了,所以我们要通过重新导入sys来设置系统编码。

问题二:为什么print 4,u"我"可以打印正常,print 5,"我"打印乱码

字符串的打印,python的逻辑为:如果是unicode字符串,则可以自动编码为终端所用编码,然后正确显示出来。所以u"我"实际上将"我"进行了decode成了unicode字符,然后python将unicode字符串自动化编码为gbk(我的cmd的编码)

而print 5,”我”,字符串编码为utf-8类型(文件保存的类型),输出到cmd为gbk类型的终端上,则无法显示。

问题三:为什么print 8,"我".encode('utf-8').decode('utf-8')可以打印正常,print 6,u"我".encode('utf-8')打印乱码

因为我是str类型,在encode前,python自动会用默认编码(setdefaultencoding)进行decode为unicode类型,但是如果默认编码为ascii,是不支持decode的。

可以看到文件里修改了默认编码为utf-8,所以"我".encode('utf-8').decode('utf-8')这句首先会decode('utf-8')为unicode类型,然后在encode('utf-8').decode('utf-8'),此时”我”已经变成了unicode类型,如果是unicode字符串,则可以自动编码为终端所用编码(这是问题一中提到的),这样就能输出到cmd终端了。

然后我们再说为什么print 6,u"我".encode('utf-8')会乱码呢,上面已经讲了在encode('utf-8')之前会decode('utf-8')为unicode类型,然后在执行.encode('utf-8'),此时”我”会被编码成utf-8,然后print输出到cmd的gbk终端,由于编码不统一,就会乱码。

三:判断字符的编码类型

1. chardet.detect(字符内容)

#encoding=utf-8

import chardet

import urllib

TestData = urllib.urlopen('http://www.baidu.com/').read()

print chardet.detect(TestData)

发现打印的字符编码类型为utf-8。

2. import chardet如果报错ImportError: No Module named chardet,则需要下载安装该模块,步骤为:

第一步:在https://pypi.python.org/pypi/chardet#downloads下载chardet-2.1.1.tar.gz

第二步:解压 chardet-2.1.1.tar.gz文件到\Lib\site-packages下

第三步:安装 chardet模块,进入到python的\Lib\site-packages\chardet-2.3.0路径下,执行python setup.py install

这样就完成chardet模块安装了,此时你可以在去运行上面的文件。

四:文件存储和读取的编码

1. 计算机内存中,统一使用unicode编码,当需要保存到硬盘或需要传输的时候,就转换为UTF-8编码

2. 用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把unicode转换为UTF-8保存到文件

3. 浏览网页的时候,服务器会把动态生成的unicode内容转换为UTF-8在传输到浏览器

很多网页源码上会有类似<meta charset='utf-8'/>的信息,表示该网页正是用的UTF-8编码

小记:

a.  在utf-8文件中,则这个字符串就是utf-8编码的,它的编码取决与当前的文本编码。

b.  GB2312文本的编码就是GB2312。

c.  在同一个文本中进行两种编码的输出等操作就必须进行编码的转换,先用decode将文本原来的编码转换成unicode,再用encode将编码转换成需要转换成的编码。

d.  实例练习:

手工创建一个文件如a.txt,以ansi编码保存即gbk,然后取出数据变成utf-8编码保存到b.txt文件中,查看b.txt文件编码为utf-8

#encoding=utf-8

f=open('C:\\Users\\yumeiling\\Desktop\\a.txt','r')

data=f.read()

temp = data.decode('gbk')

f.close()

f=open('C:\\Users\\yumeiling\\Desktop\\b.txt','w')

temps=temp.encode('utf-8')

f.write(temps) #写入utf-8字符,并进行保存

f.close()

运行结果为:查看b.txt文件

这样执行后,发现生成了b.txt文件,文件的编码为改成了utf-8编码。

笔记四:python乱码深度剖析二的更多相关文章

  1. 笔记三:python乱码深度剖析一

    一:学习内容 python编码转换 python乱码原因深入解析 二:python编码转换 1. Python内部字符串一般都是Unicode编码,代码中字符串的默认编码与代码文件本身的编码是一致的. ...

  2. libevent源码深度剖析二

    libevent源码深度剖析二 ——Reactor模式 张亮 前面讲到,整个libevent本身就是一个Reactor,因此本节将专门对Reactor模式进行必要的介绍,并列出libevnet中的几个 ...

  3. libevent学习笔记(参考libevent深度剖析)

    最近自学libevent事件驱动库,参考的资料为libevent2.2版本以及张亮提供的<Libevent源码深度剖析>, 参考资料: http://blog.csdn.net/spark ...

  4. [Android] Toast问题深度剖析(二)

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者: QQ音乐技术团队 题记 Toast 作为 Android 系统中最常用的类之一,由于其方便的api设计和简洁的交互体验,被我们所广泛采用 ...

  5. Python学习笔记(四)Python函数的参数

    Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...

  6. Django深度剖析-二

    WEBserver处理过程 先写个大家熟悉的socketserver例子 #! /usr/bin/env python # encoding: utf-8 """ @Au ...

  7. ASP.NET乱码深度剖析

    写在前面 在Web开发中,乱码应该算一个常客了.今天还好好的一个页面,第二天过来打开一看,中文字符全变“外星文”了.有时为了解决这样的问题,需要花上很长的时间去调试,直至抓狂,笔者也曾经历过这样的时期 ...

  8. python笔记 利用python 自动生成条形码 二维码

    1. ean13标准条形码 from pystrich.ean13 import EAN13Encoder encode = EAN13Encoder(') encode.save('d:/barco ...

  9. 学习笔记之Python人机交互小项目二:名片管理系统

    继上次利用列表相关知识做了简单的人机交互的小项目名字管理系统后,当学习到字典时,老师又让我们结合列表和字典的知识,结合一起做一个名片管理系统,这里分享给在学习Python的伙伴! 1.不使用函数 1 ...

随机推荐

  1. Android Studio生成get,set,tostring,构造方法

    如何在AndroidStudio开发Android应用程序的时候,在对象模型中生成快捷方式生成get,set,tostring,构造方法等: 有两种方式: 第一种方式:Code –> Gener ...

  2. Django:如何给文章列表添加图片

    思路: 使用ajax方式将图片和文本一起通过formData提交到后台,Django后台通过request.POST和request.FILES方式接收数据 1.前端代码 {% extends 'ba ...

  3. 【原创】Self-Contained Container(自包含容器)

    自包含容器是一种自包含的结构,很有趣.需要使用模板类,但只有在模板类型是该类的子类时,才使该类具有自包含的结构.这种结构从数据结构的角度看比较有用.通常的树类中的模板通常是“数据”的概念,即模板不参与 ...

  4. 委托发展史(Linq操作符)

    嗯~这篇就讲讲Linq吧! 之前讲过Lambda最后进化到了令人发指的地步: Func<string, int> returnLength; returnLength = text =&g ...

  5. netcore 发布 到 windows server IIS 可能会报错

    当发布netcore 到windows server iis可能会报这种错:An error occurred while starting the application 不要慌,这个时候可能是你用 ...

  6. Godot开发环境与学习资源

    记得第一次听到Godot的名字时还在深圳工作,刚刚接触Unity快一年,只是匆匆在Github上star了,就没有继续了.后面时不时翻开它的Git主页,然而一直没有下载过,每每想看看开源引擎都去看Or ...

  7. BZOJ 5395--[Ynoi2016]谁的梦(STL&容斥)

    5395: [Ynoi2016]谁的梦 Time Limit: 80 Sec  Memory Limit: 128 MBSubmit: 22  Solved: 7[Submit][Status][Di ...

  8. Python 读取大文件的方式

    对于读取容量小的文件,可以使用下面的方法: with open("path", "r") as f: f.read() 但是如果文件容量很大,高达几个G或者十几 ...

  9. jzoj5923

    我們可以記f[i]表示i個點的連通圖的個數 則我們可以考慮將i個點不必聯通的圖個數(記為g)減去i個點的不連通圖個數 那麼f[i]=g[i]-c(j-1,i-1)f[j]gi-j 枚舉一個j,強制將j ...

  10. 一个钓鱼WiFi的破解

    在开始前我们先安装下工具 git clone [url]https://github.com/P0cL4bs/WiFi-Pumpkin.git[/url] [/size] [size=4][size= ...