Python字符编码讲解
声明:本文参考 Python字符编码详解
在计算机中我们不管用什么语言和程序,最终数据在计算机中的都是字节码(也就是01形式)的形式存在的,如果
计算机直接把字节码显示在屏幕上,很明显一般人看不懂字节码,我们能看懂的只有字符,所以就需要用程序把字节码翻译成字符,要
将字节码翻译成字符,必须在字节码和字符之间建立一种逻辑映射的关系, 我们就使用这种逻辑映射的关系在字节码和字符之间互相
转化,这种逻辑映射关系我们就称之为字符集。
所以字节码和字符之间的翻译过程就是编码或者解码的过程,至于这种逻辑映射关系,计算机早期是老外发明的,而他们顶多使用
128个字符,所以就建立了一种称之为ASCII的逻辑映射关系,但是随着计算机的普及很明显128个字符不能表示所有人类所能识别的字
符,于是各个国家各个名族就发明了合适自己语言的逻辑映射关系比如中文的GBK,韩文的ks_c_。多种逻辑映射关系就使得写程序变
得混乱,于是就建立一个全球通用的逻辑映射关系UCS,USC几乎可表示全球所有的字符,USC中每个字符对应一个码元(也就是一个整数
),比如 "汉" 子对应的码元是 67721(6c49)。
当然UCS只是定义了一个标准的逻辑映射关系,至于怎么实现则有很多种方式,比如"汉"在UCS中的码元是 6C49,我们知道在计算机
中任何数据都是以一个字节一个字节的形式存储的,6C49 很明显不能用一个字节表示,那么改用几个字节表示合适呢?于是就有了几
中不同的解决方案 UCS-2(也就是UTF-16)则使用2个字节表示,USC-2是定长存储中所有字符都是用两个字节表示,按照楼主说法美国
人觉得亏了英文字母只用一个字节就能保存了,英文之外在用多字节表示也就是UTF-8解决方案。也就说UCS只是一个可扩展的字典(
如果遇到一个它不能翻译的字符,则把它加入到这个字典中,并为这个字符定义一个码元),UTF-8,UTF-16则是具体的实现方式。
str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对UTF-8编码的str'汉'使用len()函数时,结果是3,因为实际上,UTF-8编码的'汉' == '\xE6\xB1\x89'。
unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'汉') == 1。
Python中的 str 本质是一个 字节串类似于 Java中的 byte[],而unicode则相当于Java中的 String
下面通过Python和Java代码的例子来对比:
Python代码:
u = u'汉'
s = '汉'
print repr(u) #输出 u'\u6c49'
print repr(s) #输出 '\xe6\xb1\x89'
print len(u) #输出 1
print len(s) #输出 3
print repr(s[1:]) #输出 '\xb1\x89' s2 = u.encode('utf-8')
print repr(s2) #输出 '\xe6\xb1\x89'
u2 = s2.decode('utf-8')
print repr(u2) #输出 u'\u6c49'
我们可以用看出 unicode 表示真正的字符串,而 str 只是 unicode编码后的字节串(可以理解为字节数组)
如果我们直接用 s = '汉' 其实python已经对 '汉'进行了编码,也就是说 s 指向的是'汉'编码后的字节串
上段Python代码中编码和解码的过程用Java表示为:
String s = "汉";
byte[] bytes = s.getBytes("UTF-8"); //编码的过程
String s2 = new String(bytes, "UTF-8") //解码的过程
Python中读写文件本质上是对字节串的读写
f = open('test.txt')
u = u'汉'
s = u.encode('utf-8')
f.write(s)
f.close()
我们打开test.txt文本后,文本中显示"汉"
Java代码:
String s = "汉";
byte[] bytes = s.getBytes("UTF-8");
RandomAccessFile f = new RandomAccessFile("test2.txt", "rw");
f.write(data)
f.close()
同样打开test2.txt后文本后,文本中显示 "汉"
Python中读文件
f = open('test.txt', 'r')
s = f.read()
u = s.decode('UTF-8')
Java读文件
FileInputStream fin = new FileInputStream("test2.txt");
byte[] bytes= new byte[3];
fin.read(data2);
fin.close();
String s = new String(bytes, "UTF-8")
所以如果你对文本读操作之前要明白文本编码集,你才能进行正确的解码操作。
Python字符编码讲解的更多相关文章
- python 字符编码讲解
ANSI不是一种具体的编码格式 ANSI在中文Windows操作系统代码指的是GBK编码 ANSI在中文Mac操作系统代码指的是UTF-8编码 ANSI在其他国家的操作系统中有其他的编码格式 #ASC ...
- python 字符编码练习
通过下面的练习,加深对python字符编码的认识 # \x00 - \xff 256个字符 >>> a = range(256)>>> b = bytes(a) # ...
- 深入理解Python字符编码--转
http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...
- 深入理解Python字符编码
不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError.UnicodeDecodeError 错误,每当遇到错误我们就拿着 enc ...
- Python字符编码详解,str,bytes
什么是明文 “明文”是可以是文本,音乐,可以编码成mp3文件.明文可以是图像的,可以编码为gif.png或jpg文件.明文是电影的,可以编码成wmv文件.不一而足. 什么是编码?把明文变成计算机语言 ...
- Python字符编码补充
字符编码: Python字符编码贯穿Python学习的始终,现在应用的是Python2中字符编码的问题是很多的. 这次是要彻底解决Python字符编码的问题!!! 1 字符编码的发展过程: 1 .AS ...
- python --- 字符编码学习小结(二)
距离上一篇的python --- 字符编码学习小结(一)已经过去2年了,2年的时间里,确实也遇到了各种各样的字符编码问题,也能解决,但是每次都是把所有的方法都试一遍,然后终于正常.这种方法显然是不科学 ...
- 转1:Python字符编码详解
Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...
- 转2:Python字符编码详解
1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...
随机推荐
- Python程序的执行原理(转载)
Python程序的执行原理 2013-09-17 10:35 佚名 tech.uc 1. 过程概述 Python先把代码(.py文件)编译成字节码,交给字节码虚拟机,然后虚拟机一条一条执行字节码指令 ...
- html5之canvas困惑 在canvas标签内需要设置了宽跟高,如果在css中设置同样的宽跟高,画出来的图像变形了?
<canvas class="cvs"></canvas> 遇到的问题: 如css 中设.cvs{width:500px;height:400px;},也就 ...
- 【边做项目边学Android】小白会遇到的问题--This Android SDK requires Android Developer Toolkit version 23.0.0 or above
问题描写叙述: 上一篇讲到解决Appcompat_V7问题要减少adt版本号,于是就换旧版本号22.3.0啊,又一次打开Eclipse.立刻弹出: This Android SDK requires ...
- hdoj Last non-zero Digit in N! 【数论】
找规律! 求N!最后非0位的值.比方2是120的最后一个不是0的值. 输入N比較大,要大数保存. 注意到最后0的个数是与5的因数的个数相等.设f(n)为n!的最后非0位. 那么f(n)=((n%5)! ...
- 轻量级的原型设计工具-Axure RP
1. 软件下载地址: http://www.downxia.com/downinfo/25742.html 这个版本不需要注册码,不需要安装,存绿色版. 2. 基本介绍教程: http://wenku ...
- 深入掌握JMS--转
深入掌握JMS(一):JSM基础 1. JMS基本概念 JMS(Java Message Service) 即Java消息服务.它提供标准的产生.发送.接收消息的接口简化企业应用的开发.它支持 ...
- Java基础知识强化之集合框架笔记37:用户登录注册案例
1. 登录注册案例分析图解: 2. 用户登录案例 详细分析 和 分包实现: (1)用户登录案例详细分析(面向对象思想) 按照如下的操作,可以让我们更符合面向对象思想: • 有哪些类呢? ...
- Python开发【第十三篇】:jQuery(二)
http://www.bubuko.com/infodetail-1438296.html 处理完毕需要整理贴进来 Python之路[第十三篇]jQuery案例-Form表单&插件及扩展 ...
- (转)javaScript call 函数的用法说明
call 方法 请参阅 应用于:Function 对象 要求 版本 5.5 调用一个对象的一个方法,以另一个对象替换当前对象. call([thisObj[,arg1[, arg2[, [,.argN ...
- JAVA除去制定字符的方法
只需调用replaceAll()方法: public class Test { public static void main(String[] args) { String s= "abc ...