Python中文乱码详解
- 格式:docx
- 大小:86.94 KB
- 文档页数:9
python中⽂乱码的解决⽅法乱码原因:源码⽂件的编码格式为utf-8,但是window的本地默认编码是gbk,所以在控制台直接打印utf-8的字符串当然是乱码了!解决⽅法:1、print mystr.decode('utf-8').encode('gbk')2、⽐较通⽤的⽅法:import systype = sys.getfilesystemencoding()print mystr.decode('utf-8').encode(type)1. Python中列表或字典输出乱码的解决⽅法问题: Python中的列表(list)或字典包含中⽂字符串,直接使⽤print会出现以下的结果:#打印字典dict = {'name': '张三'}print dict>>>{'name': ' e5 bc a0 e4 b8 89'}#打印列表list = [{'name': '张三'}]print list>>>[{'name': ' e5 bc a0 e4 b8 89'}]解决⽅案:使⽤以下⽅法进⾏输出:import json#打印字典dict = {'name': '张三'}print json.dumps(dict, encoding="UTF-8", ensure_ascii=False)>>>{'name': '张三'}#打印列表list = [{'name': '张三'}]print json.dumps(list, encoding="UTF-8", ensure_ascii=False)>>>[{'name': '张三'}]2. Python2.7的UnicodeEncodeError: ‘ascii' codec can't encode异常错误#重置编码格式import sysreload(sys)sys.setdefaultencoding('utf-8')以上就是python中⽂乱码的解决⽅法的详细内容,更多关于python乱码的资料请关注其它相关⽂章!。
中文乱码解决方案一、引言随着全球化进程的加速,跨国交流和跨文化交流变得越来越频繁。
作为全球最大的人口国家之一,中国在国际交流中发挥着重要的作用。
然而,在跨文化交流的过程中,我们常常会遇到一个共同的问题,即中文乱码。
中文乱码是指在计算机系统中,由于编码方式不兼容或设置错误,导致中文字符无法正确显示的现象。
本文将介绍一些常见的中文乱码问题以及解决方案。
二、常见中文乱码问题及原因1. 网页中出现乱码在浏览网页时,我们经常会遇到中文乱码的问题,这主要是由于网页编码方式不兼容或设置错误所引起的。
常见的编码方式包括UTF-8、GBK、GB2312等,如果网页编码方式与浏览器设置的编码方式不一致,就会导致中文字符无法正确显示。
2. 文本文件打开后乱码当我们使用文本编辑器打开一个文本文件时,如果文件的编码方式与编辑器的默认编码方式不一致,就会导致文件内容显示为乱码。
常见的文本文件编码方式有UTF-8、GBK、GB2312等。
3. 数据库中存储的中文乱码在数据库中存储中文信息时,如果数据库的编码方式设置不正确,就会导致存储的中文字符显示为乱码。
常见的数据库编码方式有UTF-8、GBK、GB2312等。
三、中文乱码解决方案1. 网页中文乱码解决方案(1)设置浏览器编码方式:在浏览器的设置选项中,找到编码方式(通常在“字符编码”、“编码”或“语言”选项下),将其设置为与网页编码方式一致的选项,如将编码方式设置为UTF-8。
(2)手动指定网页编码:如果网页上没有明确设置编码方式的选项,可以尝试在浏览器地址栏中手动添加编码方式,如在URL后面添加“?charset=utf-8”。
2. 文本文件乱码解决方案(1)使用支持多种编码方式的文本编辑器:选择一个支持多种编码方式的文本编辑器,如Notepad++、Sublime Text等。
在打开文本文件时,可以手动选择文件的编码方式来正确显示内容。
(2)重新保存文件:将文本文件另存为选项,选择正确的编码方式,再重新打开文件即可解决乱码问题。
完美解决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'),这样创建的中⽂⽂件名就没有乱码问题了。
以上就是⼩编为⼤家带来的完美解决Python2操作中⽂名⽂件乱码的问题全部内容了,希望⼤家多多⽀持~。
python中unicode、utf8、gbk等编码问题为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本⽂就来研究⼀下这个问题。
字符串在Python内部的表⽰是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另⼀种编码。
decode的作⽤是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表⽰将gb2312编码的字符串str1转换成unicode编码。
encode的作⽤是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表⽰将unicode编码的字符串str2转换成gb2312编码。
因此,转码的时候⼀定要先搞明⽩,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码代码中字符串的默认编码与代码⽂件本⾝的编码⼀致。
如:s='中⽂'如果是在utf8的⽂件中,该字符串就是utf8编码,如果是在gb2312的⽂件中,则其编码为gb2312。
这种情况下,要进⾏编码转换,都需要先⽤decode⽅法将其转换成unicode编码,再使⽤encode⽅法将其转换成其他编码。
通常,在没有指定特定的编码⽅式时,都是使⽤的系统默认编码创建的代码⽂件。
如果字符串是这样定义:s=u'中⽂'则该字符串的编码就被指定为unicode了,即python的内部编码,⽽与代码⽂件本⾝的编码⽆关。
因此,对于这种情况做编码转换,只需要直接使⽤encode⽅法将其转换成指定编码即可。
pythonutf8编码中文
Python是一个强大的编程语言,它支持多种编码方式,包括UTF-8编码。
UTF-8编码是一种Unicode字符集的变体,它可以表示任何字符,包括中文字符。
在Python中使用UTF-8编码来处理中文非常方便,只需在字符串前面加上u表示Unicode字符集即可。
例如,下面的代码中,我们定义了一个包含中文字符的字符串,并将它打印出来:
```
# -*- coding: utf-8 -*-
str = u'你好,世界!'
print(str)
```
在这个例子中,我们将文件的编码方式设置为UTF-8,使用了Unicode字符集来表示字符串,然后将字符串打印出来。
如果我们不在字符串前面加上u,那么Python就会默认使用ASCII编码来处理字符串,这样就会出现编码错误。
在Python中,我们还可以使用encode方法将字符串转换成UTF-8编码的字节串,例如:
```
# -*- coding: utf-8 -*-
str = u'你好,世界!'
bytes = str.encode('utf-8')
print(bytes)
```
在这个例子中,我们使用encode方法将字符串转换成UTF-8编码的字节串,然后将字节串打印出来。
需要注意的是,在使用UTF-8编码时,中文字符会占用多个字节,因此在处理字符串时需要注意字节长度的问题。
总的来说,Python中使用UTF-8编码非常方便,可以轻松地处理中文字符串和字节串。
掌握UTF-8编码的使用方法对于Python编程非常重要。
UnicodeDecodeError是Python 在尝试读取或解码文件时可能遇到的一个常见错误。
这通常是因为Python 试图以指定的编码打开一个使用不同编码方式编码的文件。
以下是一些解决UnicodeDecodeError的方法:1.指定正确的编码:当你尝试打开或读取文件时,可以明确指定正确的编码。
例如,如果你知道文件是以UTF-8 编码的,你可以这样打开它:python代码with open('filename.txt', 'r', encoding='utf-8') as f:content = f.read()2.使用错误处理:你可以在open()函数中添加errors参数来处理编码错误。
例如,errors='ignore'会简单地忽略无法解码的字符:python代码with open('filename.txt', 'r', encoding='utf-8',errors='ignore') as f:content = f.read()3.使用codecs模块:codecs模块可以让你更灵活地处理编码问题。
例如,你可以尝试几种不同的编码直到找到一个可以成功读取文件的编码:python代码import codecswith codecs.open('filename.txt', 'r', encoding='utf-8',errors='ignore') as f:content = f.read()4.检查源文件的编码:有时,UnicodeDecodeError是因为源文件本身就不是预期的编码。
在这种情况下,你需要找出文件的实际编码,并使用这个编码来读取文件。
5.确保文件不是损坏的:如果文件是损坏的或者内容本身就是非法的Unicode,那么你可能需要重新获取文件或者修复内容。
python读写csv时中⽂乱码问题解决办法CSV是英⽂Comma Separate Values(逗号分隔值)的缩写,顾名思义,⽂档的内容是由 “,” 分隔的⼀列列的数据构成的,可以使⽤excel和⽂本编辑器等打开。
CSV⽂档是⼀种编辑⽅便,可视化效果极佳的数据存储⽅式1、python读写、追加csv⽅法:‘r’:只读(缺省。
如果⽂件不存在,则抛出错误)‘w’:只写(如果⽂件不存在,则⾃动创建⽂件)‘a’:附加到⽂件末尾(如果⽂件不存在,则⾃动创建⽂件)‘r+’:读写(如果⽂件不存在,则抛出错误)1import csv,os2if os.path.isfile('test.csv'):3 with open("test.csv","r") as csvfile:4 reader = csv.reader(csvfile)5#这⾥不需要readlines6for line in reader:7print lineimport csv#python2可以⽤file替代open#不存在则会创建⽂件with open("test.csv","w") as csvfile:writer = csv.writer(csvfile)#先写⼊columns_namewriter.writerow(["index","a_name","b_name"])#写⼊多⾏⽤writerowswriter.writerows([[0,1,3],[1,2,3],[2,3,4]])import csv#python2可以⽤file替代open#不存在则会创建⽂件with open("test.csv","a") as csvfile:writer = csv.writer(csvfile)#先写⼊columns_namewriter.writerow(["index","a_name","b_name"])#写⼊多⾏⽤writerowswriter.writerows([[0,1,3],[1,2,3],[2,3,4]])2、excel打开csv⽂件,可以识别编码“GB2312”,但是不能识别“utf-8”,数据库⾥的字符串编码是utf-8.因此:当从csv读取数据(data)到数据库的时候,需要先把GB2312转换为unicode编码,然后再把unicode编码转换为utf-8编码:data.decode('GB2312').encode('utf-8')当从数据库读取数据(data)存到csv⽂件的时候,需要先把utf-8编码转换为unicode编码,然后再把unicode编码转换为GB2312编码:data.decode('utf-8').encode('GB2312')3、decode('utf-8')表⽰把utf-8编码转换为unicode编码;encode('utf-8')表⽰把unicode编码转换为utf-8编码4、Unicode只是⼀个符号集,它规定了符号的⼆进制代码,却没有规定⼆进制代码如何存储5、可以使⽤python的编码转换模块:codecs1 python unicode⽂件读写:23#coding=gbk4import codecs56 f = codecs.open('c:/intimate.txt','a','utf-8')#这⾥表⽰把intimate.txt⽂件从utf-8编码转换为unicode,就可以对其进⾏unicode读写了7 f.write(u'中⽂')#直接写⼊unicode8 s = '中⽂'9 f.write(s.decode('gbk'))#先把gbk的s解码成unicode然后写⼊⽂件10 f.close()1112 f = codecs.open('c:/intimate.txt','r','utf-8')13 s = f.readlines()14 f.close()15for line in s:16print line.encode('gbk')6、python代码⽂件的编码py⽂件默认是ASCII编码,中⽂在显⽰时会做⼀个ASCII到系统默认编码的转换,这时就会出错:SyntaxError: Non-ASCII character。
中文转码乱码规律-概述说明以及解释1.引言1.1 概述概述部分:中文乱码是指在文本处理过程中因编码格式不统一导致中文字符显示不正确的现象。
在数字化时代,人们越来越频繁地在互联网上进行文字交流,而中文乱码问题也随之变得更加普遍。
中文乱码的产生源于多方面原因,例如使用不同的编码格式、系统之间的不兼容性、网页编码错误等。
为了有效解决中文乱码问题,我们需要深入了解其产生原因和解决方法,以便更好地处理和显示中文文本。
本文将探讨中文乱码的原因、现象及解决方法,希望能帮助读者更好地理解和处理中文乱码问题。
1.2文章结构文章结构部分的内容:本文共分为引言、正文和结论三部分。
在引言部分,将介绍本文的概述、文章结构和目的;在正文部分,将详细讨论中文乱码产生原因、中文乱码现象和中文乱码解决方法;最后在结论部分,对本文进行总结、归纳并展望未来研究方向。
整个文章结构清晰,逻辑严谨,旨在全面而系统地讨论中文转码乱码规律相关问题。
1.3 目的本文旨在探讨中文转码乱码现象的规律和机制,通过对中文乱码产生原因、现象以及解决方法的分析,希望能够帮助读者更好地理解和解决在日常使用电脑、网络等场景中遇到的中文乱码问题。
同时,也旨在引起更多人对中文乱码问题的关注,促进相关技术的改进和提升,提升中文信息传输的效率和准确性。
通过深入研究和讨论,希望能够为解决中文乱码问题提供一些新的思路和方法。
2.正文2.1 中文乱码产生原因中文乱码产生的主要原因可以归纳为以下几点:1.字符编码不一致:在传输过程中,如果发送端和接收端使用的字符编码不一致,就会导致中文乱码。
例如,发送端使用UTF-8编码发送数据,而接收端使用GBK编码接收数据,就会出现乱码现象。
2.文本信息传输过程中被篡改:在信息传输过程中,可能会经过多个中间节点,如果有中间节点对文本信息进行了篡改,可能会导致中文乱码。
3.文件格式不匹配:如果在打开文件时使用的解码器与文件本身的编码格式不匹配,也会导致中文乱码。
在利用Python运行CMD命令时,经常会面临编码格式的问题。
Python作为一种强大的脚本语言,可以方便地执行系统命令,但在处理中文时,编码格式常常成为一个难题。
本文将通过深入的研究和广泛的讨论,帮助你全面理解Python运行CMD命令使用的编码格式。
一、初识编码格式1. 了解编码格式的含义编码格式是用来在计算机中表示字符的规则和方式,常见的编码格式有ASCII、UTF-8、GB2312等。
在处理中文时,编码格式的选择非常重要,不同的编码格式会导致中文字符的显示和存储出现问题。
2. Python中的编码格式Python的默认编码格式是UTF-8,这种编码格式支持全球范围内的几乎所有字符,并且在处理中文时表现良好。
通常情况下,我们在使用Python执行CMD命令时需要注意保持编码格式的一致性,以避免出现乱码或异常情况。
二、Python运行CMD命令常见的编码格式问题1. 中文显示乱码在执行CMD命令时,如果涉及中文字符,很容易出现乱码的情况。
这是因为CMD命令默认使用的编码格式是GB2312,而Python的默认编码格式是UTF-8,二者不一致导致的结果。
2. 文件路径包含中文导致错误当文件路径中包含中文字符时,通过Python执行CMD命令可能会出现路径错误的情况。
这也是因为编码格式不一致导致的结果。
三、解决编码格式问题的方法1. 使用chcp命令修改CMD的编码格式通过执行chcp命令,可以修改CMD的默认编码格式为UTF-8,从而解决中文显示乱码的问题。
在Python中,可以使用subprocess模块来执行chcp命令,确保CMD和Python的编码格式保持一致。
2. 使用os模块处理文件路径在Python中,可以使用os模块来处理文件路径,通过将中文路径转换为Unicode编码,可以避免执行CMD命令时出现路径错误的情况。
四、个人观点和总结在使用Python执行CMD命令时,编码格式的问题是一个需要重视的方面。
linux python中文乱码解决方法-概述说明以及解释1.引言1.1 概述概述部分是文章引言的一部分,它的目的是提供一个简要的介绍,概括文章的主题和内容。
在“Linux Python中文乱码解决方法”这篇长文中,概述部分可以包括以下内容:概述:随着Linux和Python的广泛应用,中文乱码问题也逐渐成为了许多开发者和用户的关注焦点。
在日常的Linux和Python编程过程中,我们经常会遇到中文乱码的情况,这不仅给我们的工作带来了不便,还可能影响程序的正确执行。
因此,解决Linux和Python中文乱码问题成为了一个重要的任务。
本文将从两个方面详细介绍Linux 和Python 中文乱码问题的原因和解决方法。
首先,我们将探讨Linux 系统中的中文乱码问题,分析其产生的原因和对应的解决方法。
其次,我们将深入探讨Python 编程语言中出现的中文乱码问题,解释其中的原因,并提供相应的解决方案。
通过本文的阐述,读者将能够更好地理解和解决在Linux 和Python 中遇到的中文乱码问题。
总结:在本文的结论部分,我们将总结我们在解决Linux 和Python 中文乱码问题的过程中所采用的方法和技巧。
我们将讨论这些方法的有效性和适用性,并提供一些建议,帮助读者在实际的工作和学习中更好地解决中文乱码问题。
通过本文提供的解决方案,读者将能够提高工作效率,避免中文乱码带来的困扰,并更好地利用Linux 和Python 进行程序开发和日常使用。
通过本文的阅读和理解,读者将对Linux 和Python 中文乱码问题有更清晰的认识,并能够运用相应的解决方法,提高工作效率和代码质量。
同时,本文还为解决其他编程语言或操作系统中出现的中文乱码问题提供了一个思路和参考。
文章结构部分的内容:1.2 文章结构本文将分为三个主要部分:引言、正文和结论。
- 引言部分将概述整篇文章的主要内容和目的,以便读者能够了解文章的背景和意义。
Python中文乱码详解本文目的为 Python 程序员简练地介绍字符编码相关支持,彻底解疑‚ Python 中文乱码‛,‚ Python 2与 Python 3 字符编码差异‛等相关问题。
使用其他语言的程序员可作参考,道理都是相通的,不过具体处理方式不同罢了。
痛苦的根源∙起因计算机不能直接识别字符(文本的最小组成单位)。
∙字形:字的形状,又叫字图。
文字的抽象形状,‚小短横线‛就是汉字‚一‛的字形。
∙字符:抽象符号和数字成对编码用于在计算机系统中表示的信息单位。
虽然字符本身是抽象的,但它一旦存在于计算机系统中,它就对应了某种特定字符编码方式。
字符‚一‛在GBK编码中是0xD2BB。
∙字体:字的形体。
草书、行书、楷书,都叫字体。
计算机中的字体如:华文行楷,微软雅黑。
∙解决办法但是计算机可以识别二进制数,于是采用一个二进制数来指代一个字符。
∙结果很多人都想到了这个解决办法。
比如拉丁字母,他们想到了用十进制65来表示字符’A’。
不同国家或者不同组织,他们因为事先没有商量,都用了同一个整数来表示他们自己国家里的某个文字。
在不相互沟通的时候相安无事,但相互沟通时,就出现了问题。
编码与解码先记住,任何信息,存放在存储介质中时,都是二进制流(比特流)。
∙编码过程:字符转换成二进制流表示的过程。
∙解码过程:二进制流转换成字符的过程。
∙编码规则:编码和解码过程中遵循的规则,例如GBK编码,UTF-8编码。
字符编码的来龙去脉ASCII美国信息交换标准代码,最早的通用编码方案。
开始时,只用7个比特位就表示完了所有拉丁文字母和一些符号,共128个。
后来发现不够用,又启用了第8位,刚好一个字节的长度,共256个字符。
但是,不同的公司/组织把这扩展出来的128个码位指派给了不同的字符,文档交流就困难了。
于是ANSI这个组织站出来了,制定了ANSI标准。
而且人们也发现,ASCII这种单字节(因为它占8个比特位)编码满足不了更多的字符需求,那必须得用多个字节编码。
多字节字符集(MBCS)概念就诞生了。
ANSI美国国家标准协会认可的标准。
注意,它是一种标准,而不是某种具体编码,可以看做是编码的一种分类。
ANSI的标准就是,ASCII码占用的码位及其所指代的字符不许改变,剩下的自己扩展。
中国人在这个规定上有自己的扩展(如GBK),英国人也有自己的扩展(如ISO-8859-1,即latin-1)。
所以ISO-8859-1和GBK都可以称之为ANSI编码,因为它们符合ANSI规定。
以Windows系统为例,中文系统中所指的ANSI编码就是GBK,英文系统中的ANSI编码就是ISO-8859-1。
MBCS多字节字符集(Multi-Byte Character Set),采用不定长度可以是一个字节,也可以是两个字节,也可以是三个字节来进行编码。
大多数情况下2个字节就够用了,汉字就分配两个字节,称之为DBCS(Double-Byte Chactacter Set)。
在Linux系统中看得到MBCS说法,在Windows中呢?其实就是ANSI,ANSI只规定了第一个字节的位置是ASCII,超出这个范围的,肯定也是多字节的了。
CodePage代码页,把一种字符编码方式(和字符集有区别,稍后讲解)放在一个CodePage上,编码解码就像翻书查字典似的。
很多个代码页,也就容纳了很多种编码方式。
这个概念最早来自IBM,但也被微软等公司采用。
同一种编码方式,在不同的公司制定的CodePage里‚页码‛也不相同。
比如UTF-8,在微软的CodePage里是65001,在IBM里是1208。
注意:MBCS、DBCS、CodePage、ANSI,它们各自指代的不是某种具体编码,而是符合某种规则的编码方式的统称。
在不同的操作系统或平台下,它们有一个默认值而已。
PS:微软的CP936不等于GBK,它们有几十个不太常用的字符不同。
所以绝大多数情况下感觉不到差异。
Unicode/UCS通过以上的介绍知道,各种解决方案都是各自为政,解决不了“同一个系统中同时显示全宇宙的所有字符”这个问题。
于是就有两个组织,他们开始着手做这件事情,UCS和Unicode诞生了。
∙通用字符集(UCS,Universal Character Set)是由国际标准化组织(ISO)制定的 ISO 10646标准所定义的字符集。
通常也译为通用多八位编码字符集。
∙统一码(Unicode)是由统一码联盟指定的。
后来发现,一山不容二虎,世界人民不需要两个目的相同但是具体实现却有差异的编码方案。
UCS和Unicode握手言和,从 Unicode 2.0 起,采用了和ISO 10646-1的编码方案,它们在相同的码位上都对应同样的字符。
尽管这两个组织目前还在相互独立的在发布字符编码标准。
可能是Unicode名字好记,所以采用更为广泛。
关于UCS-2,UCS-4这些概念不再赘述,自行查阅。
Unicode,UTF-8,UTF-16它们是什么关系UTF-8(Unicode Transformation Format)即Unicode转换格式,8的意思是使用8比特为单位来进行编码。
码位小于128时,就是对应的字节值;大于等于128时,就会转换成2、3、4字节的序列。
每个字节的序列值介于128~255。
GBK,GB2312,Latin-1,Big-5,ASCII等,它们的字符集和具体编码实现方式绑定(如GBK字符集就采用GBK编码方式),即字符和存储在介质上的二进制流一一对应。
缺陷很明显,字符集扩展性差。
Unicode考虑了这个问题,所以它的编码与编码的实现方式没有绑定。
而是有多种实现方式,如UTF-8,UTF-16,UTF-32。
例如字符‘A’在Unicode中的编码是65,但存储在介质上时,二进制流的十六进制表示采用UTF-8时是0x41,而UTF-16大端模式是0x00 0x41。
至于什么是大端模式、小端模式,UTF-X,GBXXX的具体编码实现方式请自行查阅。
内码与外码∙内码:存储在介质上时使用的编码形式。
例如GBK,GB2312。
∙外码:外部输入系统时的编码。
例如拼音输入法编码,仓颉输入法编码。
例如:采用仓颉输入法对汉字‚驹‛的编码是NMPR,输入系统以后得到字符‚驹‛。
使用GBK作为内码进行存储时就是0xBED4。
乱码产生的原因编码和解码时用了不同或者不兼容的字符编码方式。
就算同是Unicode,UTF-8和UTF-16也是不的。
解决乱码问题,需要把握的要点:∙输入某软件系统时字符所采用的编码是什么?(从数据库或文件读取时,原来存储时的编码是什么?从网页抓取时,网页的编码是什么?从控制台输入时,控制台的编码方式是什么?)∙软件系统中的编码方式是什么?(原本若是UTF-8存储,GBK编码的软件系统该如何处理?)∙输出时的编码方式是什么?(如Python脚本处理后的字符串是Unicode编码,输出到采用GBK编码的Windows控制台时应该做什么?)Python 2.x字符编码问题Python 2 字符(串)类型探究∙basestring:str和unicode对象的基类,抽象的,不可被调用或实例化,仅可用于类型检查。
isinstance(obj, basestring)等价于isinstance(obj, (str,unicode))。
1 2 3 4>>>isinstance('驹', basestring) True>>>isinstance(u'驹', basestring) True∙str:实际是字节串。
Python2中也有bytes对象。
bytes == str结果为True。
例如:‘驹’,这个字符串长度为1,但len('驹')在windows平台下是2(默认GBK),Linux平台下是3(默认UTF-8)。
1>>>isinstance('驹', str)2 3 4True>>>isinstance(u'驹', str) False∙unicode:unicode(string[, encoding, errors]) ,按照encoding参数指定的编码方式把参数string转换成unicode。
unicode编码的字符串对象,也可以直接加前缀u表示。
len(u'驹')在Windows和Linux下都是1。
1 2 3 4>>>isinstance('驹', unicode) False>>>isinstance(u'驹', unicode) True∙unicode构造器的参数encoding默认是7位ASCII编码,所以默认时传入的字节串或字符串的每一个字节值必须小于128:∙Windows系统下:1 2 3 4 5 6 7 8 9 10 11 12 13# Win平台默认情况下就是GBK编码,所以以下结果就是GBK编码值>>> '驹''\xbe\xd4'# 报错,试图用unicode方法默认的ASCII 编码去解码GBK 编码的字符>>>unicode('驹')Traceback (most recent call last):......UnicodeDecodeError: 'ascii' codec can't decode byte 0xbe ...#正确,录入时以GBK编码,故而以GBK方式去解码,再转换成Unicode 形式>>>unicode('驹', 'GBK') # 等价于u'驹'u'\u9a79'∙Linux系统下:1 2 3# Linux平台默认情况下就是UTF-8编码,所以以下结果就是UTF-8编码值>>> '驹''\xe9\xa9\xb9'45 6 7 8 9 10 11 12 13# 报错,试图用unicode方法默认的ASCII 编码去解码UTF-8 编码的字符>>>unicode('驹')Traceback (most recent call last):......UnicodeDecodeError: 'ascii' codec can't decode byte 0xbe ...#正确,录入时以GBK编码,故而以GBK方式去解码,再转换成Unicode 形式>>>unicode('驹', 'UTF-8') # 等价于u'驹'u'\u9a79'∙总结1:通过系统shell录入或直接在程序中定义的字符串,Python 2 中默认就是str对象(字节串),其字节值是由系统默认编码方式编码所得,Windows是GBK编码方式,Linux是UTF-8。