`

python 编码

 
阅读更多
非常非常牛逼的问题
在解码urlencode的时候,如果涉及到多种编码,需要现在urllib.unquote之前,就转化成str类型,不要把unicode类型放到urllib.unquote这个函数中

s.decode 这里不光是解码,而且是把str转化成unicode对象
u.encode
如下:
key=key.decode("gbk").encode("utf-8")
       



在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
  BYTE data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97}; // UTF-8编码
  WORD data_utf16[] = {0x6c49, 0x5b57}; // UTF-16编码
  DWORD data_utf32[] = {0x6c49, 0x5b57}; // UTF-32编码
  这里用BYTE、WORD、DWORD分别表示无符号8位整数,无符号16位整数和无符号32位整数。UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位。“汉字”的UTF-8编码需要6个字节。“汉字”的UTF-16编码需要两个WORD,大小是4个字节。“汉字”的UTF-32编码需要两个DWORD,大小是8个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。下面介绍UTF-8、UTF-16、UTF-32、字节序和BOM。

首先要搞清楚,字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对UTF-8编码的str'汉'使用len()函数时,结果是3,因为实际上,UTF-8编码的'汉' == '\xE6\xB1\x89'。
需要注意的是,虽然对str调用encode()方法是错误的,但实际上Python不会抛出异常,而是返回另外一个相同内容但不同id的str;对unicode调用decode()方法也是这样。很不理解为什么不把encode()和decode()分别放在unicode和str中而是都放在 basestring中,但既然已经这样了,我们就小心避免犯错吧。
UTF-8的特点是对不同范围的字符使用不同长度的编码。


python的str,unicode对象的encode和decode方法
python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byte[]。
而python中的unicode对象应该才是等同于java中的String对象,或本质上是java的char[]。
对于

Python代码  
1.s= "你好"    
2.u=u"你好"    

1. s.decode方法和u.encode方法是最常用的,
简单说来就是,python内部表示字符串用unicode(其实python内部的表示和真实的unicode是有点差别的,对我们几乎透明,可不考虑),和人交互的时候用str对象。
s.decode -------->将s解码成unicode,参数指定的是s本来的编码方式。这个和unicode(s,encodename)是一样的。
u.encode -------->将unicode编码成str对象,参数指定使用的编码方式。
助记:decode to unicode from parameter
encode to parameter from unicode
只有decode方法和unicode构造函数可以得到unicode对象。
上述最常见的用途是比如这样的场景,我们在python源文件中指定使用编码cp936,
# coding=cp936或#-*- coding:cp936 -*-或#coding:cp936的方式(不写默认是ascii编码)
这样在源文件中的str对象就是cp936编码的,我们要把这个字符串传给一个需要保存成其他编码的地方(比如xml的utf-8,excel需要的utf-16)
通常这么写:
strobj.decode("cp936").encode("utf-16")

You typically encode a unicode string whenever you need to use it for IO, for instance transfer it over the network, or save it to a disk file.
To convert a string of bytes to a unicode string is known as decoding. Use unicode('...', encoding) or '...'.decode(encoding).
You typically decode a string of bytes whenever you receive string data from the network or from a disk file.
2.
第一条已经写了不少,因为是最常用到的,基本不用怎么解释。我重点想说的是这第二条。
似乎有了unicode对象的encode方法和str的decode方法就足够了。奇怪的是,unicode也有decode,而str也有
encode,到底这两个是干什么的。
用处1
str本身已经是编码过的了,如果再encode很难想到有什么用(通常会出错的)
先解释下这个
str.encode(e) is the same as unicode(str).encode(e).
This is useful since code that expects Unicode strings should also work when it is passed
ASCII-encoded 8-bit strings(from Guido van Rossum)
python之父的这段话大概意思是说encode方法本来是被unicode调的,但如果不小心被作为str对象的方法调,并且这个str对象正好
是ascii编码的(ascii这一段和unicode是一样的),也应该让他成功。这就是str.encode方法的一个用处(我觉得这个基本等于没用)
类似地,把光用ascii组成的unicode再decode一回是一样的道理,因为好像几乎任何编码里ascii都原样没变。因此这样的操作等于没做。
u"abc".decode("gb2312")和u"abc"是相等的。

用处2
非字符的编码集non-character-encoding-codecs,这些只在python中定义,离开python就没意义(这个来自python的官方文档)
并且也不是人类用的语言,呵呵。
比如

Python代码  
1.'\n' .encode( 'hex' )== '0a'    
2.u'\n' .encode( 'hex' )== '0a'   
3.'0a' .decode( 'hex' )== '\n'   
4.u'0a' .decode( 'hex' )== '\n'   

可见名为hex的编码可以讲字符表示(当然了,必须是ascii内的)和十六进制表示之间转换
另外还有很多好玩的,比如:base64通俗的讲是号称防君子不防小人的给邮件的编码,gzip大概是指压缩吧(这是我猜的),rot13回转13等,不知者google之
关于这些,官方有个详细的表格,在http://docs.python.org/library/codecs.html中的Standard Encodings一节中,前一个表格是基于字符的编码,第二个表格
就是这里的非字符的编码。关于这些特殊编码,官方一句说明:
For the codecs listed below, the result in the “encoding” direction is always a byte string.
The result of the “decoding” direction is listed as operand type in the table.
encode的结果一定是一个byte的str,而decode的结果在表中operand一列。


参考
Converting Between Unicode and Plain Strings 在Unicode和普通字符串之间转换
http://wiki.woodpecker.org.cn/moin/PyCkBk-3-18
what’s the difference between encode/decode? (python 2.x)
http://stackoverflow.com/questions/447107/whats-the-difference-between-encode-decode-python-2-x
http://docs.python.org/library/codecs.html


编码声明的作用
请参考http://www.python.org/dev/peps/pep-0263/
声明源文件中将出现非ascii编码;
在高级的IDE中,IDE会将你的文件格式保存成你指定编码格式。
决定源码中类似于u'哈'这类声明的将'哈'解码成unicode所用的编码格式,也是一个比较容易让人迷惑的地方。
(java不需要声明的原因在于:java中默认是本地编码而py中默认是ascii,搞得python更易出错,
并且,java编译的时候还有个指定编码的参数encoding)

文件的编码格式决定了在该源文件中声明的字符串的编码格式,例如:

Python代码  
1.str =  '哈哈'    
2.print  repr(str)   

a.如果文件格式为utf-8,则str的值为:'\xe5\x93\x88\xe5\x93\x88'(哈哈的utf-8编码)
b.如果文件格式为gbk,则str的值为:'\xb9\xfe\xb9\xfe'(哈哈的gbk编码)

我的理解:文件编码格式保存后没有地方指明,只有靠聪明或笨的编辑器,编译器去猜。而声名就更精确一些。
让两者一致了总不会错。

其实好多其他语言或应用中也是类似的decode和encode概念,比如在java中String的涉及的编码转换及jdk中的工具native2ascii,
好像javascript也有这个,记不清楚了。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/suofiya2008/archive/2011/05/12/6415162.aspx

分享到:
评论

相关推荐

    PEP8Python 编码规范

    标题“PEP8 Python编码规范”指出,接下来的内容会涉及将Python代码从英文注释和文档转变成中文注释和文档的数据规范。这实际上是有关代码国际化和本地化的问题,不过,原文提到的“将Python的英文编码变成中文的...

    Python编码规范(Google)

    ### Python编码规范详解(基于Google风格指南) #### 一、概览 Python作为一种广泛使用的高级编程语言,其编码规范对于确保代码的可读性和一致性至关重要。Google作为业界领先的公司之一,发布了一份详细的Python...

    python编码规范及中文手册

    Python编码规范.ppt则是一份演示文稿,它以幻灯片的形式展示了编码规范,便于在培训或讲解时使用。最后,python基础班资料包括了入门级的Python学习材料,是初学者学习编程的良好起点。整体而言,这些文档为Python...

    google的python编码规范.pdf

    Google Python 编码规范 本文档是 Google 公司的 Python 编码规范,旨在为 Python 程序员提供一个详细的编码风格指南。该指南涵盖了 Python 语言规则、 Python 风格规则、代码编写风格、注释、类、字符串、TODO ...

    Python 编码规范(Google).doc

    Python 编码规范(Google) Python 编码规范是 Google 提出的编程风格指南,旨在帮助开发者编写高质量的 Python 代码。本文将详细介绍 Python 编码规范的主要内容,包括编码风格、命名约定、注释、缩进、行连接等方面...

    PEP8Python编码规范.pdf

    "PEP8 Python 编码规范" PEP8 是 Python 官方提供的一份编码规范指南,旨在提高 Python 代码的可读性、可维护性和可重用性。本文档将对 PEP8 中的各种规范进行详细解释和总结。 缩进和换行 PEP8 规定使用 4 个...

    Python 编码规范(Google) _ 菜鸟教程.pdf

    Python编码规范(Google)是由Google公司所提出的Python编程风格指南,旨在提高代码的可读性和一致性。这个规范并非由Google官方直接创建和维护的项目,而是由国内程序员基于对Google风格的喜爱而创建和维护。本文档...

    Python编码规范.pdf

    Python 编码规范 Python 编码规范是指在编写 Python 代码时需要遵守的一系列规则和约定,以确保代码的可读性、可维护性和一致性。该规范涵盖了代码的布局、缩进、空格、行的最大长度、空行、编码、导入、空格等方面...

    python编码规范

    ### Python编码规范详解 #### 一、引言 在Python编程的世界里,遵循一定的编码规范不仅能够提升代码的可读性和可维护性,还能帮助开发者更好地融入社区,提高团队协作效率。本文旨在介绍Python官方推荐的编码规范...

    python编码规范.txt

    ### Python编码规范详解 #### 一、概述 Python作为一种广泛使用的高级编程语言,其编码规范对于提高代码可读性、可维护性和团队协作至关重要。本文档基于“python编码规范.txt”这一资料,深入探讨了Python编程的...

    python编码规范.pdf

    ### Python编码规范详解 #### 1. 介绍 ##### 1.1 开发背景 Python作为一门高级编程语言,因其简洁、易读的语法而受到广大开发者们的喜爱。随着Python在自动化测试领域的广泛应用,制定一套统一的编码规范变得尤为...

    Google Python Style Guide中文版(Google Python编码规范)

    网上找到的Goolge Python编码规范。包含两个版本,Google Python Style Guide中文版_li3p.pdf,Google-python-style-guide中文版_guoqiao.pdf。两份文档内容基本一致,guoqiao翻译的格式比较好,带详细书签。

    PEP8 Python编码规范

    PEP8是Python编程语言的官方编码规范,它由Python的核心开发者Guido van Rossum、Barry Warsaw和Nick Coghlan等人撰写和维护,最初于2001年发布。PEP是Python Enhancement Proposals的缩写,意为Python增强提案。PEP...

    python编码规范.ppt

    python编码规范,基础学习知识,喜欢的来哦

    python编码格式

    Python编码格式是编程实践中至关重要的一个方面,它不仅关乎代码的可读性和一致性,还直接影响到团队合作的效率。以下是一些关于Python编码格式的重要规范和建议: 1. **缩进**:Python语言中,缩进是代码块的分隔...

    Google Python Style中文版(Google Python编码规范)

    网上收集的Goolge Python编码规范。包含两个版本,Google Python Style Guide中文版_li3p.pdf,Google-python-style-guide中文版_guoqiao.pdf。两份文档内容基本一致,guoqiao翻译的格式比较好,而且带详细书签。

    Python 编码规范

    ### Python编码规范详解 #### 一、概述 Python作为一种广泛使用的高级编程语言,其编码规范对于提高代码可读性、可维护性和团队协作至关重要。本文将详细介绍由国内程序员基于Google的Python风格指南创建和维护的...

Global site tag (gtag.js) - Google Analytics