Python乱码,编码,repr,encode,decode探究

#encoding:utf-8
#用命令行执行

s = ‘百度‘
print s # 输出环境为gbk,编码为utf-8,输出乱码
print s.decode(‘utf-8‘) # => 发现输出环境为gbk,自动转换
print s.decode(‘utf-8‘).encode(‘utf-8‘) # 输出环境为gbk,编码为utf-8,输出乱码
print s.decode(‘utf-8‘).encode(‘gbk‘) # 输出环境为gbk,编码为gbk,正常输出


# s = 0xF21938274ABDS... 二进制内存
# 把这些内存数据转化为可显示的字符串就是repr(s)的print结果,不可显示的字符变为如\x,
# repr(s) 并非这些内存数据,也并非内存数据按char解释成可显示的字符。
# repr(s) 的意义是 print repr(s)的到的结果,是内存数据按char解释成可现实的字符
# 如设 s = 0x24 = ‘\n‘, 则 print repr(s) => ‘\n‘, repr(s)为‘\\n‘ (因为要显示\)
#
# s 的内存数据按照一定编码解释,可以得到正确意义
# 若s是按照utf-8编码的 ‘哈哈‘,用utf-8解释就可以得到 ‘哈哈‘ 的意义
# 在python中把s按照 xyz 编码解释,就是 s.decode(xyz)
# s.decode(xyz) 在python中得到一个变量,不关心它的内存表示,也许就是『数据+编码方式』
# 无论在内存中如何表示,这个变量的抽象意义可以提取出,我们就认为它是抽象的 ‘哈哈‘
# 一个解释后的字符串,可以转换其编码,就是意义不变,编码方式变,得到不同的二进制数据
# cmd的输出环境为gbk,utf-8编码的二进制数据直接在cmd里print会得到乱码
# 将utf-8编码的数据先用utf-8格式解码出意义,再将其编码为gbk二进制数据,在cmd输出正常
# 将utf-8编码的数据先用utf-8格式解码出意义,直接输出,python会自动检测输出环境
# 将知道意义的字符串按照输出环境自动解码


# python中#encoding:xxx是说明在python代码按照什么格式解码
# 一般不同的编码英文都相同可以识别
# 而文件在编辑时是与编辑器交互,编辑时我们看到的是意义,编辑器使用一种编码保存代码意义
# 代码意义被编辑器保存成二进制数据文件在存储器里
# 代码文件被python解释器执行时,会查找其中#encoding:xxx,确定代码格式编码
# 如果代码中声明的编码方式和文件保存的编码方式不同,除了英文字符,其他很可能出错
# 以为python解释器用B编码去解释编辑器用A编码保存的意义
# 一般来说中文的不同编码方式都不兼容,所以不同编码的解释会导致乱码


# 通俗解释
# 我们用来交流的都是语言的意义,不同编码相当于不同文字的书写,都是用来保存意义
# 拿到一段文字,按英语语法解释就是将其用英语格式解码。python中decode
# 心理想一段话,按中文写下来就是将其用中文编码保存。python中encode
# 我们与输入输出交互的是意义,如果其输出不是乱码,表示意义交互成功,否则失败
# 编码方式是不同软件 解释器,文件编辑器,cmd命令行 它们使用的语言。
# 也就是我们要让这些软件成功的交流,在他们可能使用不同语言情况下。
# 这样,我们把意义传给编辑器,编辑器用A语言书写,解释器就要用A语言阅读。
# 而cmd输出需要用B语言,解释器就要把A语言的文字转化成意义,在转化成B语言给cmd
# cmd拿到B语言的文字,可以翻译出它的意义,显示在屏幕上,也就是没有乱码的输出结果



# 所以,上面的代码如果不在cmd在其他python IDE里执行,可能得到结果不同
# 因为cmd会的是gbk "语言",而其他的python IDE可能直接会utf-8,那乱码出现的情况就不同

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。