大冶seo网站优化排名推荐,泰安网站设计公司,源汇区建设局网站,企业网站关键词优化Python 2.x中的字符编码#xff0c;设计的的确不好#xff0c;导致初学者#xff0c;甚至是即使用Python很长时间的人#xff0c;都会经常遇到字符编解码方面的错误。下面就把一些常见情#xff0c;尽量的都整理出来#xff0c;并给出相应的解决办法。看此文之前Python中…Python 2.x中的字符编码设计的的确不好导致初学者甚至是即使用Python很长时间的人都会经常遇到字符编解码方面的错误。下面就把一些常见情尽量的都整理出来并给出相应的解决办法。看此文之前Python中字符编码所涉及的背后逻辑(从你输入字符到终端显示字符的背后过程)在去了解Python编码解码之前还有个更加重要但是很多时候却被其他解释相关知识的人所忽略的问题那就是对于Python中字符串输入输出的背后逻辑。即知其所以然。此处就简单介绍一下在Python中从你所输入的字符串到显示出字符串这背后的过程是什么样的。只有了解了这个大概的过程和背后的逻辑你才能真正理解后面的所解释的字符串编码解码方面的错误以及如何解决这样的错误。对于你你只是看到的是你输入了字符串不论是从Python的IDLE中输入的还是写入到Python文件中的然后你去运行的对应代码该Python代码经过Python系统(此处及之后我称其为Python解析器)的处理使得你可以看到最终所输出的字符串不论是在Python的IDLE中看到的还是在windows的cmd中看到的。对于Python解析器而Python解析器所干的事情就是Python解析器根据当前的所用的字符串编码类型此字符串编码类型是你自己所设置的不论是在Python的IDLE中还是Python文件中都是你自己显示指定对应的编码类型的当然你没显示的指定的话那就用默认的配置如果是Python的IDLE如果你没修改defaultencoding那么就使用默认的字符编码可以通过sys.getdefaultencoding()而获得比如此处获得是ascii此处插入图片ascii如果是Python文件如果你没声明文件编码则使用默认的编码UTF-8常见的做法是指定为对应的UTF-8类型# -- coding: utf-8 --相关内容不了解的可参考【整理】关于Python脚本开头两行的#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型去执行你的Python代码其中很常见的几种动作是打印print对应的所获得的字符对于字符串打印,Python的逻辑:如果是Unicode字符串,则可以,自动地,编码为对应的终端所用编码,然后正确的显示出来比如unicode的字符串,输出到windows的默认编码为GBK的cmd中,则Python可以自动将Unicode编码为GBK,然后输出到cmd中个别特殊情况,也会出错:当此unicode字符串中包含某特殊字符,而目标终端的编码集合中,没有此字符,则很明显也是无法实现将Unicode编码为对应的特定编码的字符串,无法正确显示的如果是某种编码类型的str,则需要该str的编码类型,和目标终端编码匹配比如GBK的字符串,输出到windows的默认编码为GBK的cmd,则是可以正常输出的此处后来经过代码测试就发现一个有趣或者说诡异的问题虽然我们python文件声明的UTF-8编码但是实际上实际上是用GBK编码而此时文件中的字符串很明显是用GBK存储的所以将此GBK字符输出到GBK的cmd中是可以正常输出的。即此处字符串的类型很明显只和文件所用的实际编码有关而和文件所声明的代码无关。如果是UTF-8的字符串,输出到windows的默认编码为GBK的cmd,就会出错对相应的字符进行编码(为某种特定类型的字符str)或解码(为对应的unicode类型的字符)比如将当前的某种编码的字符串解码为Unicode字符串很明显也是要保证你字符串本身的编码和所指定的编码两者之间要一致的比如decodedUnicode someUtf8Str.decode(UTF-8)而如果用这样的decodedUnicode someGbkStr.decode(UTF-8)那就会出现错误所以你要确保当前输入的字符串的编码和对应的编码设置一致才能使得解析器正常解析你的字符串确保输出字符串时所用字符(的编码)和目标输出所用的编码一致才能正常在输出终端显示确保字符串本身的编码和你去解码等操作所用的编码一致否则很明显会由于编码不一致而无法进行解码(等操作)常见错误简介很明显如果你不遵守上述规则出现前面编码不一致的情况那么就会出现一些常见的编码解码方面的错误了。此处只是简单举例如下你python文件本身是GBK的对应的字符串也是GBK的然后你指定按照UTF-8解码为对应的Unicode那么当然会导致人家Python解析器按照UTF-8编码的方式去解析你的实际上是GBK的字符当然会出错无法解析了。你所要打印的字符本身是UTF-8的但是要打印输出的终端是windows的cmd其默认编码为GBK即将UTF-8的字符显示到GBK编码的cmd中当然也会出现错误了你所要打印出来的字符虽然是unicode但是其中包含了某些特殊字符而对应的特殊字符在终端所用的编码中不存在比如将含某些特殊字符的Unicode字符串打印到windows的默认编码为GBK的cmd中而GBK编码集合中本身就没有这些字符所以当然也是无法显示会出现对应的UnicodeEncodeError的错误的。所以诸如此类的问题如果搞懂了之前的逻辑那么自然很容易理解其错误的根源并找到解决办法。即知其所以然之后更容易知其然。下面就来故意的再现出各种Python 2.x中所常见的字符的编码解码等方面的错误然后帮你找到问题的根本原因进而找到问题所对应的解决办法Python 2.x的字符编码本身的设计的逻辑str和unicode想要了解Python 2.x中字符串编解码的问题和原因首先搞懂Python 2.x中在字符串的方面是如何设计的其主要分两大类str和unicode。对于str和unicode的确切含义以及如何互相转换以及Python 2.x和Python 3.x中的bytes和str有何区别等内容之前已经详尽的总结了不了解的也是需要去看懂然后才能真正明白下面的问题的原因的。Python中常见字符的编码和解码方面的错误的现象原因及其解决办法提醒1.下面的代码如果想要拷贝粘贴到文件中去测试的话请注意文本本身所用编码。未必一定是声明的那个编码详情请自己看代码中的中文说明。不过最简单的是直接右键另存为对应的python文件省去你拷贝粘贴转码等烦心事了。2.关于代码编辑器推荐用Notepad3.其中对于文件转换编码等事宜不了解的可以参考Python中想要将某字符串解码为对应的Unicode但是所使用的编码类型和字符串本身的编码不匹配现象字符串本身是某种编码类型的字符串但是结果将其解码为对应的Unicode时却指定了另外一种编码类型导致无法正常的解码为对应的Unicode而出现UnicodeDecodeError之类的错误。比如用UTF-8去解码GBK的字符串#!/usr/bin/python# -*- coding: utf-8 -*--------------------------------------------------------------------------------Function:【总结】Python中常见字符编码和解码方面的错误及其解决办法http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solutionAuthor: CrifanVerison: 2012-11-29-------------------------------------------------------------------------------def python2xDecodeGbkWithUtf8():zhcnActualGbk 此处你所看到的中文字符所处的环境是\r\n1.当前文件用声明的编码是UTF-8。但是后来经过证明此处实际上声明为GBK还是UTF-8对于字符串本身的编码没影响。字符串本身的编码之和当前文件的编码有关\r\n2.此处实际上文件本身却是用的GBK编码所以你看到的当前的字符串也是GBK的。所以后面要演示的\r\n3.对于GBK的字符指定用UTF-8方式去解码则会出错。\r\n4.但是由于当前字符是GBK的而后面要print打印出来到Windows的cmd中其中cmd编码(默认)为GBK所以print函数是不会出错可以正确显示此处中文字符的;print zhcnActualGbk,zhcnActualGbk; #此处是可以正常打印出上述中文字符的zhcnUnicode zhcnActualGbk.decode(UTF-8); #UnicodeDecodeError: utf8 codec cant decode byte 0xb4 in position 0: invalid start byteprint zhcnUnicode,zhcnUnicode; #上述解码出错更不可能执行到这里的print了###############################################################################if __name____main__:python2xDecodeGbkWithUtf8();要说明的是此处是只是为了代码演示所以很明显就直接看出错误了。但是实际的编程过程中由于很多时候情况很复杂未必立刻会意识到或注意到编码类型弄错了所以也还是需要注意这种情况的。原因如上所述想要把某种编码的字符串解码为Unicode字符串是A编码的(GBK)但是却用B编码(UTF-8)去解码导致出现UnicodeDecodeError错误解决办法使用和字符串本身编码相同的编码去解码就可以正常的解码为Unicode了。#!/usr/bin/python# -*- coding: utf-8 -*--------------------------------------------------------------------------------Function:【总结】Python中常见字符编码和解码方面的错误及其解决办法http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solutionAuthor: CrifanVerison: 2012-11-29-------------------------------------------------------------------------------def python2xDecodeGbkWithGbk():zhcnActualGbk 此处你所看到的中文字符所处的环境是\r\n1.当前文件用声明的编码是UTF-8。但是后来经过证明此处实际上声明为GBK还是UTF-8对于字符串本身的编码没影响。字符串本身的编码之和当前文件的编码有关\r\n2.此处实际上文件本身却是用的GBK编码所以你看到的当前的字符串也是GBK的。所以后面要演示的\r\n3.对于GBK的字符使用同样的GBK去解码则不会出错了。\r\n4.而解码后得到的Unicode字符串也可以正常在Windows的默认编码为GBK的cmd中显示了。其中内部会自动将Unicode编码为GBK然后送到cmd中显示的。;print zhcnActualGbk,zhcnActualGbk; #此处是可以正常打印出上述中文字符的zhcnUnicode zhcnActualGbk.decode(GBK); #此处使用和字符串本身一致的GBK解码就可以正常解码为Unicode了print zhcnUnicode,zhcnUnicode; #此处就可以正常输出Unicode字符串了。内部会自动将Unicode编码为GBK然后送到cmd中显示的###############################################################################if __name____main__:python2xDecodeGbkWithGbk();举一反三如果你以后遇到类似的UnicodeDecodeError那么说明是Unicode在解码方面的错误肯定是将某种编码的字符串解码为Unicode的过程中出现的错误。而错误原因也往往都是编码类型不匹配然后就可以去检查一下是不是字符串本身的编码和你在调用decode时所设置的编码不匹配。Python中打印字符串时字符串本身的编码与输出终端中所用编码不匹配现象字符串本身是某种编码的但是输出显示到终端时终端所使用编码和你字符串的编码不一样导致无法正常显示。比较常见的是本身是UTF-8类型的字符串但是却将其输出到Windows的cmd中而cmd中默认是GBK编码的导致两者不匹配所以打印字符串时出现乱码python_2.x_print_utf8_to_gbk.py#!/usr/bin/python# -- coding: utf-8 ---------------------------------------------------------------------------------Function:【总结】Python中常见字符编码和解码方面的错误及其解决办法http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solutionAuthor: CrifanVerison:2012-11-29-------------------------------------------------------------------------------def python2xPrintUtf8ToGbk():zhcnUtf8 此处你所看到的中文字符所处的环境是\r\n1.当前文件用声明的编码是UTF-8。但是后来经过证明此处实际上声明为GBK还是UTF-8对于字符串本身的编码没影响。字符串本身的编码只和当前文件的编码有关\r\n2.不过呢此处文件本身的编码的确是UTF-8的所以你看到的当前的字符串也是UTF-8编码的。所以后面要演示的\r\n3.对于UTF-8的字符去打印输出到Windows的默认编码为GBK的cmd中就会出现乱码错了。;print zhcnUtf8,zhcnUtf8; #把UTF-8的字符串输出到GBK的cmd中结果显示的都是乱码# zhcnUtf8 姝ゅ浣犳墍鐪嬪埌鐨勪腑鏂囧瓧绗︽墍澶勭殑鐜鏄細# 1.褰撳墠鏂囦欢鐢ㄥ鏄庣殑缂栫爜鏄疷TF-8銆備絾鏄悗鏉ョ粡杩囪瘉鏄庯紝姝ゅ瀹為檯涓婂鏄庝负GBK杩樻槸UTF-8锛屽浜庡瓧绗︿覆鏈韩鐨勭紪鐮侊紝娌″奖鍝嶃€傚瓧绗︿覆鏈韩鐨勭紪鐮侊紝鍙拰褰撳墠鏂囦# 欢鐨勭紪鐮佹湁鍏筹紱# 2.涓嶈繃鍛紝姝ゅ鏂囦欢鏈韩鐨勭紪鐮佺殑纭槸UTF-8鐨勶紝鎵€浠ヤ綘鐪嬪埌鐨勫綋鍓嶇殑瀛楃涓蹭篃鏄疷TF-8缂栫爜鐨勩€傛墍浠ワ紝鍚庨潰瑕佹紨绀虹殑锛?# 3.瀵逛簬UTF-8鐨勫瓧绗︼紝鍘绘墦鍗拌緭鍑哄埌Windows鐨勯粯璁ょ紪鐮佷负GBK鐨刢md涓紝灏变細鍑洪敊浜嗐€###############################################################################if __name____main__:python2xPrintUtf8ToGbk();原因把Python文件中的字符串该Python文件是UTF-8的所以该字符串也是UTF-8编码的输出到Windows的cmd中而cmd中默认编码为GBK即把UTF-8的字符串在GBK的cmd上显示则出现了乱码。解决办法目的是为了是要输出的字符串的编码是Unicode或者和目标输出终端的编码一致就可以正常输出了。所以可以把UTF-8的字符解码为对应的Unicode。(也可以进一步的把Unicode字符串编码为GBK)然后再输出到GBK的cmd中就可以正常显示不是乱码了#!/usr/bin/python# -*- coding: utf-8 -*--------------------------------------------------------------------------------Function:【总结】Python中常见字符编码和解码方面的错误及其解决办法http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solutionAuthor: CrifanVerison:2012-11-29-------------------------------------------------------------------------------def python2xDecodeUtf8ThenOutputToGbk():zhcnUtf8 此处你所看到的中文字符所处的环境是\r\n1.当前文件用声明的编码是UTF-8。但是后来经过证明此处实际上声明为GBK还是UTF-8对于字符串本身的编码没影响。字符串本身的编码只和当前文件的编码有关\r\n2.不过呢此处文件本身的编码的确是UTF-8的所以你看到的当前的字符串也是UTF-8编码的。所以后面要演示的\r\n3.对于UTF-8的字符先去指定用UTF-8去解码为Unicode然后再去输出到Windows的默认编码为GBK的cmd中就不会出现乱码错了。或者是将得到的Unicode字符串再编码为GBK然后再输出到GBK的cmd也是同样的效果。;print zhcnUtf8,zhcnUtf8; #把UTF-8的字符串输出到GBK的cmd中结果显示的都是乱码# zhcnUtf8 姝ゅ浣犳墍鐪嬪埌鐨勪腑鏂囧瓧绗︽墍澶勭殑鐜鏄細 ......紝灏变細鍑洪敊浜嗐€decodedUnicode zhcnUtf8.decode(UTF-8); #用UTF-8解码UTF-8的字符串位Unicodeprint decodedUnicode,decodedUnicode; #此处就可以正常输出了不会显示乱码了decodedUnicodeThenEncodedToGbk decodedUnicode.encode(GBK); #将Unicode的字符串编码为GBKprint decodedUnicodeThenEncodedToGbk,decodedUnicodeThenEncodedToGbk; #然后再输出到GBK编码的cmd也是同样可以正确显示的###############################################################################if __name____main__:python2xDecodeUtf8ThenOutputToGbk();举一反三以后如果再遇到类似的乱码先去确定你的字符串本身是什么编码的。再去确定你所要输出的终端目标中所用的编码是什么样的。其中输出的终端此处举例所用的是windows的cmd其他还有可能是输出内容到文件中其中还涉及文件所用的编码是什么这些都要自己搞清楚的。总之确保字符串编码类型和输出所用的编码类型两者是一致的就不会出现乱码了。Python中打印含某些特殊字符的Unicode类型字符串但是输出终端中字符编码集中不包含这些特殊字符现象虽然已经获得了Unicode的字符串了但是当打印Unicode类型的字符串到某些终端中时结果却还是出错了。比如下面的例子中就是把Unicode字符串打印到Windows的cmd中结果出错#!/usr/bin/python# -*- coding: utf-8 -*--------------------------------------------------------------------------------Function:【总结】Python中常见字符编码和解码方面的错误及其解决办法http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solutionAuthor: CrifanVerison:2012-11-29-------------------------------------------------------------------------------#任何字符都可以在#http://unicodelookup.com/#中查找到对应的unicode的值def python2xPrintUnicodeStillError():#http://zhidao.baidu.com/question/500133781.htmlslashUStr \\u3232\\u6674; #(有) 晴decodedUniChars slashUStr.decode(unicode-escape); #此处已经可以正常获得对应的两个Unicode字符了unicodeButContainSpecialChar decodedUniChars;print unicodeButContainSpecialChar,unicodeButContainSpecialChar;#此处在GBK编码的cmd中输出的话会出现错误的#UnicodeEncodeError: gbk codec cant encode character u\u3232 in position 0: illegal multibyte sequence#那是因为Unicode字符0x3232是个特殊字符而此字符在GBK编码字符集中本身就不包含此特殊字符所以当然没法把这个特殊字符编码为对应的GBK字符所以出错更无法显示###############################################################################if __name____main__:python2xPrintUnicodeStillError();原因上述过程中虽然已经获得了正确的unicode字符串了但是由于此unicode字符串中包含了一个特殊字符即那个\u3232对应的字符显示出来像是左右括号中间一个有字即类似于这样的(有)而此特殊字符GBK字符集中没有不存在所以无法将对应的Unicode字符编码为对应的GBK字符所以出现UnicodeEncodeError更无法打印出来注对于任何字符都可以去这里而查到对应的unicode的值html中的写法。提醒可以通过输入0x3232而查到该特殊字符。解决办法解决办法则是不同情况不同处理(1)如果对于这些特殊字符你不是很关心即使不显示也无所谓但是希望剩下的其他大多数的正常的字符都能显示。即忽略掉特殊字符显示哪些能显示的字符 那么可以改为如下代码#!/usr/bin/python# -*- coding: utf-8 -*--------------------------------------------------------------------------------Function:【总结】Python中常见字符编码和解码方面的错误及其解决办法http://www.crifan.com/summary_python_2_x_common_string_encode_decode_error_reason_and_solutionAuthor: CrifanVerison:2012-11-29-------------------------------------------------------------------------------#任何字符都可以在#http://unicodelookup.com/#中查找到对应的unicode的值def python2xPrintUnicodeOmitSpecial():#http://zhidao.baidu.com/question/500133781.htmlslashUStr \\u3232\\u6674; #(有) 晴decodedUniChars slashUStr.decode(unicode-escape); #此处已经可以正常获得对应的两个Unicode字符了unicodeButContainSpecialChar decodedUniChars;#print unicodeButContainSpecialChar,unicodeButContainSpecialChar;#此处在GBK编码的cmd中输出的话会出现错误的#UnicodeEncodeError: gbk codec cant encode character u\u3232 in position 0: illegal multibyte sequence#那是因为Unicode字符0x3232是个特殊字符而此字符在GBK编码字符集中本身就不包含此特殊字符所以当然没法把这个特殊字符编码为对应的GBK字符所以出错更无法显示#如果只是想要#显示那些正常可以显示的字符忽略个别特殊不能显示的字符#那么可以改为如下代码encodedShowableGbk unicodeButContainSpecialChar.encode(GBK, ignore);print encodedShowableGbk,encodedShowableGbk; #encodedShowableGbk 晴###############################################################################if __name____main__:python2xPrintUnicodeOmitSpecial();注我之前遇到的一个情况就是通过添加ignore去处理的(2)如果必须要显示这些字符或者说必须要保留这些字符。那么本身对于打印这个需求来说是可以不打印的因为本身已获得了正常的Unicode字符了。然后剩下的只是尽量你自己所需要的后续的处理即可。即 已经得到了正确的unicode字符了后续该咋办咋办可以不打印的时候就不打印也就不会出错了。举一反三如果以后遇到这种虽然已获得了Unicode字符串但是还是无法打印等情况则就要注意去调查一下是否是由于此处有特殊字符不存在于输出目标所用字符集中才导致此问题的。进一步的举一反三如果你对于上述代码中的encode中的ignore不熟悉那么你自然应该想到去了解去学习这方面的内容。然后通过google搜unicode encode ignore而如果你再稍微积极思考的话就会想到既然encode有个ignore参数那是不是还有其他参数对应的函数原型是啥由此去通过Python的自带手册就找到对应你所要的内容了str.encode([encoding[, errors]])Return an encoded version of the string. Default encoding is the current default string encoding. errors may be given to set a different error handling scheme. The default for errors is strict, meaning that encoding errors raise a UnicodeError. Other possible values are ignore, replace, xmlcharrefreplace, backslashreplace and any other name registered via codecs.register_error(), see section Codec Base Classes. For a list of possible encodings, see section Standard Encodings.New in version 2.0.Changed in version 2.3: Support for xmlcharrefreplace and backslashreplace and other error handling schemes added.Changed in version 2.7: Support for keyword arguments added.然后再细心些的话还会发现手册中str.encode上面还有个对应的decode函数也是有一些相关的参数比如’ignore’, ‘replace’的str.decode([encoding[, errors]])Decodes the string using the codec registered for encoding. encoding defaults to the default string encoding. errors may be given to set a different error handling scheme. The default is strict, meaning that encoding errors raise UnicodeError. Other possible values are ignore, replace and any other name registered via codecs.register_error(), see section Codec Base Classes.New in version 2.2.Changed in version 2.3: Support for other error handling schemes added.Changed in version 2.7: Support for keyword arguments added.由此多去学习官网的手册自然会了解到函数的最权威的解释和用法。总结凡是都是要积极思考通过有限的经验去努力获得更多的相关知识的总结。而此处上面的这些总结相应地也的确是必须经过一堆的错误从开始的一头雾水到最后的渐渐清晰以及最终的搞懂逻辑和背后的原因。总之想要学好Python或其他语言都还是要足够的积累足够的练习以及及时的总结。