您的位置:首页 > 编程语言 > Python开发

Python的字符串编码(乱码问题整理)

2018-01-28 16:24 736 查看
Python2和Python3在字符串编码上的区别



https://www.cnblogs.com/geekard/archive/2012/10/04/python-string-endec.html

在Python2中,字符串字面量对应于8位的字符或面向字节编码的字节字面量。这些字符串的一个重要限制是它们无法完全地支持国际字符集和Unicode编码。为了解决这种限制,Python2对Unicode数据使用了单独的字符串类型。要输入Unicode字符串字面量,要在第一个引号前加上前最'u'。
Python2中还有一种称为字节字面量的字符串类型,它是指一个已经编码的字符串字面量,在Python2中字节字面量和普通字符串没有差别,因为在Python2中普通字符串实际上就是已经编码(非Unicode)的字节字符串。
在Python3中,不必加入这个前缀字符,否则是语法错误,这是因为所有的字符串默认已经是Unicode编码了。如果使用-U选项运行解释器,Python2会模拟这种行为(即所有字符串字面量将被作为Unicode字符对待,u前缀可以省略)。在Python3中,字节字面量变成了与普通字符串不同的类型。

字符串字面量(stringliteral)是指双引号引住的一系列字符。字面量作为一种通用的,跨平台的数据交换格式,在程序界是公认的事实。在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数、浮点数以及字符串;而有很多也对布尔类型和字符类型的值也支持字面量表示;还有一些甚至对枚举类型的元素以及像数组、记录和对象等复合类型的值也支持字面量表示法。
如:在python中输入: >>> '张俊'
,python2 会自动将字符串转换为合适编码的字节字符串:'\xd5\xc5\xbf\xa1'

显式指定字符串类型为unicode类型:>>> u'张俊',enter后输出:u'\u5f20\u4fca',此类型字符串没有编码,保存的是字符在unicode字符集中的代码点(序号)。

>>> '张俊'.encode('utf-8')  #python2 已经自动将其转化为utf-8类型编码,因此再次编码(python2会将该字符串当作用ascii或unicode编码过)会出现错误。

>>> '张俊'.decode('utf-8')  #python2 可以正常解码,返回的字符串类是无编码的unicode类型:u'\u5f20\u4fca'

>>> b'张俊'   # ‘张俊' 已被python2转换为utf-8编码,因此已为字节字符串:'\xe5\xbc\xa0\xe4\xbf\x8a'

完美解决Python2操作中文名文件乱码的问题

Python2默认是不支持中文的,一般我们在程序的开头加上#-*-coding:utf-8-*-来解决这个问题,但是在我用open()方法打开文件时,中文名字却显示成了乱码。我先给大家说说Python中的编码问题,Python中的字符串的大概分为为str和Unicode两种形式,其中str常用的编码类型为utf-8,gb2312,gbk等等,Python使用Unicode作为编码的基础类型。str记录的是字节数组,只是某种编码的存储格式,终于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将他解码成什么样子;Unicode是一种类似于符号集的抽象编码,它只规定了符号的二进制代码,却没有规定这个二进制代码该如何存储,也就是它只是一种内部表示,不能直接保存,所以存储时需要规定一种存储形式,比如utf-8等。 

Python中有编码转换的函数有:decode(char_set) 实现char_set解码成Unicodeencode(char_set) 实现Unicode编码成char_set,查看Python文档会发现: 

open(filename, 'w')这个方法中,filename这个参数必须是Unicode编码的参数。 

我之前加上#-*-coding:utf-8-*-将编码设置为utf-8,当调用这个方法往里传参数时,需要将这个变量filename解码成Unicode。 

比如filename='中文.txt',使用open()时,这样写open(filename.decode('utf-8'), 'w'),这样创建的中文文件名就没有乱码问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: