Python中的Unicode编码和UTF-8编码

下午看廖雪峰的Python2.7教程,看到 字符串和编码 一节,有一点感受,结合崔庆才的Python博客 ,把这种感受记录下来:

ASCII码:是用一个字节(8bit, 0-255)中的127个字母表示大小写字母,数字和一些符号.主要用来表示现代英语和西欧语言。

所以处理中文就出现问题了,因为中文处理至少需要两个字节,所以中国制定了GB2312。

所以,各国制定了各国的标准。日本制定了Shift_JIS,韩国制定了Euc-kr。。。那么,乱码就来了。

为了统一,Unicode诞生了。统一码把所有语言都统一到一套编码里。解决了乱码问题,但是存储和传输效率低下的问题又来了。

因为ASCII编码是1个字节,而Unicode编码通常是2个字节。你表示一个英文字母一个字节就够了,但是Unicode却不得不用两个字节来表示(另一个字节补0)。

为了节约,出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间(ASCII码可以看成是UTF-8的一部分,所以大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作)。

现在如果我要用Notepad编辑一个python的脚本,我打开文件的过程中,内存中就开辟了一段空间,来临时存储我保存的代码,在计算机内存中,统一使用Unicode编码。

所以我写的中文字符串,要在前面加u表示是Unicode编码的字符串。

静觅博客中也是:

但是为什么有时候,我们要用到decode(‘utf-8‘),再结合静觅博客来看:

因为糗事百科的服务器发送给客户端(也就是浏览器)的响应的编码就是‘UTF-8‘:

为了在文本编辑(读取文本)时,内存中需要Unicode编码,所以用decode(‘utf-8‘)解码,把UTF-8转化为Unicode编码(同理,encode(‘utf-8‘)是把Unicode转化为UTF-8编码)。

当保存文本到保存到硬盘或者需要传输的时候,就转换为UTF-8编码,所以我们需要在python脚本开头定义#-*-coding:utf-8-*-

图片来源

廖雪峰的官方网站:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819196283586a37629844456ca7e5a7faa9b94ee8000

静觅 崔庆才的个人博客:http://cuiqingcai.com/990.html

时间: 2024-12-21 14:13:21

Python中的Unicode编码和UTF-8编码的相关文章

python中文和unicode字符串之间的互相转换

首先:中文->unicode字符串 import chardet import codecs >>> a = "我是一个中国人">>> a'\xce\xd2\xca\xc7\xd2\xbb\xb8\xf6\xd6\xd0\xb9\xfa\xc8\xcb' >>> chardet.detect(a){'confidence': 0.99, 'encoding': 'GB2312'}>>> b = a.decod

字符、字符集、编码,以及它们python中会遇到的一些问题(上)

在看了很多的博客文章之后,总结整理得到了以下文章,非常感谢这些无私奉献的博主! 文章末尾有本文引用的文章的链接,如果有漏掉的文章引用,可以发邮件联系我,随后再次附上链接! 侵删!!! 这一部分是上篇,主要讲的是字符.字符集和字符编码的一些概念,以及他们在python中的一些简单的代码示例,偏向于概念. 下篇会说编码和解码部分,以及在python中会遇到的一些编码问题,偏向于实际应用一点. 这绝对是个源远流长的大坑,对于新手来说恶心致死(尤其是windows)........... 一.字符.字符

python中unicode 和 str相互转化

python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byte[]. 而python中的unicode对象应该才是等同于java中的String对象,或本质上是java的char[]. str: s = "你好" unicode: u = u"你好“ unicode转化为str,采用encode 编码: str = u.encode('gbk') str转化为unicode ,采用decode 解码: unic

【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码

转自:http://www.crifan.com/python_already_got_correct_encoding_string_but_seems_print_messy_code/ [背景] Python中的字符编码,其实的确有点复杂. 再加上,不同的开发环境和工具中,显示的逻辑和效果又不太相同,尤其是,中文的,初级用户,最常遇到的: (1)在Python自带的IDE:IDLE中折腾中文字符,结果看到的差不多都是乱码类的东西,比如:’\xd6\xd0\xce\xc4′ (2)将一个中文

python中的编码问题:以ascii和unicode为主线

  1.unicode.gbk.gb2312.utf-8的关系 http://www.pythonclub.org/python-basic/encode-detail 这篇文章写的比较好,utf-8是unicode的一种实现方式,unicode.gbk.gb2312是编码字符集: 2.python中的中文编码问题 2.1 .py文件中的编码 Python 默认脚本文件都是 ANSCII 编码的,当文件 中有非 ANSCII 编码范围内的字符的时候就要使用"编码指示"来修正. 一个mo

Python中GBK, UTF-8和Unicode的编码问题

编码问题,一直是使用python2时的一块心病.几乎所有的控制台输入输出.IO操作和HTTP操作都会涉及如下的编码问题: UnicodeDecodeError:‘ascii’codec can’t decodebyte0xc4inposition10:ordinalnotinrange(128) 这究竟是是个什么东西?!有时稀里糊涂地用一坨encode(),decode()之类的函数让程序能跑对了,可是下次遇到非ASCII编码时又悲剧了. 那么Python 2.x中的字符串究竟是个什么呢? 基本

python中的字符串编码问题——2.理解ASCII码、ANSI码、Unicode编码、UTF-8编码

ASCII码:全名是American Standard Code for Information Interchange,ASCII码中,一个英文字母(不分大小写)占一个字节的空间,范围0x00~0x7f,即0-128. ANSI码:ANSI编码是一种对ASCII码的拓展.ANSI编码用0x00~0x7f 范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符.前126个与ASCII码相同,之后的字符全是某个国家语言的所有字符.容量2的16次

Python中编码的详细讲解

看这篇文章前,你应该已经知道了为什么有编码,以及编码的种类情况 ASCII 占1个字节,只支持英文 GB2312 占2个字节,支持6700+汉字 GBK GB2312的升级版,支持21000+汉字 Shift-JIS 日本字符 ks_c_5601-1987 韩国编码 TIS-620 泰国编码 由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,即:仅涵盖本国字符,无其他国家字符的对应关系.应运而生出现了万国码,他涵盖了全球所有的文字和二进制的对应关系, U

python中烦人的编码问题

mysql数据中都是UTF编码,导出到文件称csv还是xls都是utf-8,用python的pandas读取可以,但每次写代码的时候都需要很小心看文件原来是什么编码 比如如果在read_csv()中没用encoding转换为Unicode编码的话在后面的字段名什么都要用.decode('utf-8')来解码巨麻烦,而且在用to_csv()之类的保存时候还得再次用到encoding编码将其Unicode转换为utf-8,而且好像window都不认utf-8的,果然还是应该转换为gbk呢,,, 最最