声明:本文参考 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")

所以如果你对文本读操作之前要明白文本编码集,你才能进行正确的解码操作。

最新文章

  1. 第一次打开Photoshop时的基本设置
  2. 【Python】[面向对象编程] 类和实例
  3. 手把手教你搭建SpringMVC——最小化配置
  4. Javascript写了一个2048的游戏
  5. [转载]浅谈组策略设置IE受信任站点
  6. codevs1003 电话连线
  7. Douglas Crockford: entityify & deentityify
  8. Binomial Showdown
  9. jdk8预览
  10. 分享非常有用的Java程序 (关键代码) (三)---创建ZIP和JAR文件
  11. 第一次使用unity3d
  12. 学习H5仿制网站时遇到的问题
  13. 推荐个Mac OSX下的Code Editor:Atom
  14. SpringBoot报错
  15. keras神经网络三个例子
  16. java.io.File中字段的使用
  17. web应用 与 http协议
  18. SharePoint 错误集 2
  19. git合并冲突解决方法
  20. httpClient 深入浅出~

热门文章

  1. [NOIP2015pj题解]From某因为时间快了那么一点点超过下一位的蒟蒻(其实是纯代码).
  2. 【设计模式 - 9】之装饰者模式(Decorator)
  3. Ubuntu开机出现:Fontconfig warning:"/etc/fonts/conf.d/65-droid-sans-fonts.conf"的解决办法
  4. Linux下安装 TestLink常见问题解决方法
  5. GWT(Google Web Tookit) Eclipse Plugin的zip下载地址(同时提供GWT Designer下载地址)
  6. PPT扁平化手册 2
  7. 【BZOJ1833】【ZJOI2010】数字计数 数位DP
  8. APP安全环节缺失,手游运营商怎样应对APP破解困境
  9. ReentrantLock与synchronized的差别
  10. 设计模式22---设计模式之解释器模式(Interpreter)(行为型)