python之编码问题
二进制
------>ASCII:只能存英文和拉丁字符。一个字符占用一个字节,8位
------------>gb2312:智能6700多个中文, 1980年
gbk1.0:存了2万多字符 1995年
gb18030:2w7汉字 2000年
------------>其他国家大量编码
------------------------>统一的万国码 unicode:utf-32 一个字符占4个字节
------------------------>统一的万国码 unicode:utf-16 一个字符占2个字节
为解决内存的问题,开发了utf-16但是一些字找不到
--------------->再次改进unicode:utf-8:
英文用ASCII码占用一个字节,中文3个字节,欧洲2个字节
计算只认识二进制0,1 而在python中,字节类型就非常接近二进制
明文:就是我们可以认识的数据
密文:我们不认识,但是计算机认识的数据
注意:byts类型不会记录编码格式,但是相同的unicode字符串,根据不同的编码格式(utf-8,gbk等)得到的结果是不一致的。
py2中的编码:
py2中存在着两种数据格式:他是都是basestring的子类。
1.str 以bytes字节流存储,更接近计算机,密文,len(一个汉字) 长度是3 因为在utf-8编码的存储,一个汉字长度就是3。(所以在py2中的sock可以直接传递str)
2.unicode 以unicode编码存储,其实就是一个字符串,len(一个汉字)长度是1 就是我们认识的明文
py2的优点:
1.字符串的拼接: s="hellow"+u"yuan" 字节流与unicode 进行拼接,不是应该报错吗?
可以进行拼接 因为,py2中自动帮我们把assic码的字节流转换为了unicode。
但是在非aciic码的字节流就会失效了。比如 s='娄'+u"辉" 因此我们自己去编码
py3编码
python3 renamed the unicode type to str ,the old str type has been replaced by bytes.
1.python3 中把unicode类型 弄成了str(因为我们比较常用),原来的str弄成了bytes类型
2.定义了str 与 bytes类型的清晰界限,解释器不帮我们转换,需要我们去转换
注意:无论py2,还是py3,与明文直接对应的就是unicode数据,打印unicode数据就会显示相应的明文(包括英文和中文)
#文件开头的encoding:utf-8的作用
在py2中,默认的编码是assic 在使用 s=“汉字” 的时候,acssic码中没有,所以报错,所以使用 coding:utf-8
在py3中,默认的编码是unicode 可以使用 sys.getdefaultencoding()查看
但是 py3中str 和 py2中 str = u”“汉字”的时候,都是unicode的,内存的统一,便于操作!!
同时还需要注意一个点: 文本保存的编码方式与编译器的编码格式要一直
编码cmd下的错误:
hello.py
#coding:utf8 print ('苑昊')
文件保存时的编码也为utf8。
思考:为什么在IDE下用2或3执行都没问题,在cmd.exe下3正确,2乱码呢?
我们在win下的终端即cmd.exe去执行,大家注意,cmd.exe本身就是一个软件;当我们python2 hello.py时,python2解释器(默认ASCII编码)去按声明的utf8编码文件,而文件又是utf8保存的,所以没问题;问题出在当我们print'苑昊'时,解释器这边正常执行,也不会报错,只是print的内容会传递给cmd.exe显示,而在py2里这个内容就是utf8编码的字节数据,而这个软件默认的编码解码方式是GBK,所以cmd.exe用GBK的解码方式去解码utf8自然会乱码。
py3正确的原因是传递给cmd的是unicode数据,符合ISO统一标准的,所以没问题。(这里也解释了为什么 字符串默认就是unicode的方式更好。)
python之编码问题的更多相关文章
- python Unicode 编码解码
1 #将Unicode转换成普通的Python字符串:"编码(encode)" 2 unicodestring = u"Hello world" 3 utf8s ...
- python的编码问题
本文简单介绍了各种常用的字符编码的特点,并介绍了在python2.x中如何与编码问题作战 :) 请注意本文关于Python的内容仅适用于2.x,3.x中str和unicode有翻天覆地的变化,请查阅其 ...
- python 字符编码练习
通过下面的练习,加深对python字符编码的认识 # \x00 - \xff 256个字符 >>> a = range(256)>>> b = bytes(a) # ...
- Python 字符编码 zz
http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American Stan ...
- python 之编码问题详解
前在一个项目中遇到用post提交一个xml,xml中含有中文,对于单独的py文件,使用urllib2.urlopen完全ok,但在django中使用就一直报编码错误,然后在网上看到这篇文章不错,决定m ...
- 19.python的编码问题
在正式说明之前,先给大家一个参考资料:戳这里 文章的内容参考了这篇资料,并加以总结,为了避免我总结的不够完善,或者说出现什么错误的地方,有疑问的地方大家可以看看上面那篇文章. 以下说明是针对于pyth ...
- Python字符编码详解
1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...
- python的编码
python的编码 1.概述 讲述编码,那么就要涉及到几个方面,包括系统中如何来显示字符,文件中如何来保存字符. 1.1 系统环境 在系统中显示字符,那么就必须要考虑到系统中使用的编码格式. 在lin ...
- 【转】Python字符编码详解
转自:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American S ...
- python与编码
Python中的文字对象 Python 3.x中处理文字的对象有str, bytes, bytearray. bytes和bytearray可以使用除了用作格式化的方法(format, format_ ...
随机推荐
- ACM_并查集
//题意:ignatius过生日,客人来到,他想知道他需要准备多少张桌子.然而一张桌子上面只能坐上相互熟悉的人, //其中熟悉可定义成为A与B认识,B与C认识,我们就说A,B,C相互熟悉 .例如A与B ...
- v-for并判断当前元素是否选中:$set实现响应添加属性
前言 一直纠结着使用v-for进行列表渲染时如何为当前的元素添加是否选中的标识. 1.v-for进行列表渲染 <div class="lists"> <ul> ...
- dig(域信息搜索器)命令
dig命令 dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. 语法 dig(选项)(参数) 选项 @<服务器地址>:指定进行域名解析的域名服务器: -b<ip地 ...
- PHP 获得当前页面所有变量常量的值
get_defined_vars() - 返回由所有已定义变量所组成的数组,这个函数在二次开发的时候用起来非常给力: get_defined_constants();可以返回当前的所有常量 zend的 ...
- intellij idea on update action\on frame deactivation ||Servlet 页面不同步问题
当修改servlet源码时,对应的servlet页面即使刷新也不会改变,,,很烦躁 因为xx.java需要编译成xx.class后,再部署到服务器上才可以运行,所以问题就是服务器里的类文件并没有更新. ...
- 使用git bash提交代码到github托管
1.首先登录到https://github.com注册Github帐号,并且创建一个repository. 或者登录到 https://git.oschina.net/注册账号,并且创建一个rep ...
- vue中什么样的数据可以是在视图中显示
1. Vue中不可以添加不存在的属性,因为不存在的属性是没有getter和setter的. <div id="app"> {{msg.a}} {{msg.b}} < ...
- 一个故事讲明白线程的私家领地:ThreadLocal
张大胖上午遇到了一个棘手的问题,他在一个AccountService中写了一段类似这样的代码: Context ctx = new Context(); ctx.setTrackerID(.....) ...
- 原生JS实现百度搜索功能
今天呢给大家分享一下自己用原生JS做的一个百度搜索功能,下面上代码: <!DOCTYPE html> <html> <head> <meta charset= ...
- Log4j扩展使用--日志格式化器Layout
Layout:格式化输出日志信息 OK,前面我已经知道了.Appender必须使用一个与之相关联的Layout,这样才能知道怎样格式化输出日志信息. 日志格式化器Layout负责格式化日志信息,方法l ...