python字符串处理方式以及解决字符串乱码不再是难题

简介

相信很多程序员都碰到过字符串乱码的问题,有的人初步分析下就容易定位出问题来,而有的人就像无头苍蝇一样,就是瞎撞,gbk不好使,就换utf-8,再不行decode,encode…,一堆尝试。
其实,一开始,我也是一样,对字符集不是很懂,不管是使用c/c++编程,还是python,只要碰到程序里有中文了,就不知所措,花了几天时间研究了字符集相关知识,总算有点收获。大体列举如下注意事项:

  1. 要处理的数据是什么字符集的
  2. 你的编译器默认使用什么字符集,是否和你要处理的数据的字符集一样呢
  3. 当你在控制台打印数据的时候,数据的字符集是否和控制台使用的字符集一致呢

所以,在处理数据的时候一不小心就会乱了,下面我用python进行相关演示。
关于字符集介绍,我有专门的文章进行介绍,建议先把字符集相关的知识了解透彻了,再进行相关编程工作。

python2.x

python2缺省使用ascii编码处理数据,所以程序中有中文时就需要注意了。
演示1:win7,系统字符集gbk,用notepad新建test.py文件(文件编码缺省也是gbk的),输入以下代码

s1='helloworld'
print s1

执行结果(正确显示):

E:\>python test.py
helloworld

演示2:win7,系统字符集gbk,用notepad新建test.py文件(文件编码缺省也是gbk的),输入以下代码

s1='你好'

print s1

执行结果(错误):

E:\>python test.py
  File "test.py", line 1
SyntaxError: Non-ASCII character '\xc4' in file test.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

上面的提示信息很明确了,说是在test.py文件中找到了非ascii字符’\xc4’,原因也提示了,说是没有进行编码声明,那python2编译器就使用默认ascii字符集进行解析,发现非ascii字符,报语法错误。
演示3:win7,系统字符集gbk,用notepad新建test.py文件(文件编码缺省也是gbk的),输入以下代码

#coding:gbk
s1='你好'

print s1

执行结果(正确显示):

E:\>python test.py
你好

这里的代码比上面演示2的代码多了一行(#coding:gbk),这一行的作用是声明文件的编码方式是gbk,那么python2解释器就安装gbk方式去解析test.py文件,解析正确,同时将s1输出到控制台正确显示。

演示4:win7,系统字符集gbk,用notepad++新建test.py文件(编码方式使用utf-8),输入以下代码
在这里插入图片描述

#coding:utf-8
s1='你好'

print s1

执行结果(乱码):

E:\>python test.py
浣犲ソ

这里的代码与上面演示3代码唯一的不同是gbk换成了utf-8,文件的编码方式由utf-8换成了gbk,有人可能会想utf-8不是通用码吗?怎么还会乱码,这里需要说下,utf-8不是通用码,它只是unicode字符集的一种编码方式,真正的通用码是unicode码。这里没有报语法错误,而是输出乱码,是因为我的控制台使用的是gbk编码,而当utf-8字节流(E4 BD A0 E5 A5 BD)输出到控制台时,反而按gbk字符集解析字符,变成了 浣犲ソ,明白了吧。控制台是无法帮你把Utf-8转换成gbk的。

演示5:win7,系统字符集gbk,用notepad新建test.py文件(文件编码缺省也是gbk的),输入以下代码

#coding:utf-8
s1='你好'

print s1

执行结果(正确显示,瞎猫碰上死耗子):

E:\>python test.py
你好

这种方式是最需要注意的,文件的真实编码是gbk的,而代码里却声明文件的编码是utf-8,欺骗了python2解释器,python2解释器就安装utf-8去解析源码文件,解析结果放到s1中,然后将s1的字节流(C4 E3 BA C3)输出到控制台,而控制台恰好使用的是gbk编码,和文件编码一样,所以就被正确显示出来了,好吧。

演示6:win7,系统字符集gbk,用notepad新建test.py文件(文件编码缺省也是gbk的),输入以下代码

#coding:gbk
s1=u'你好'

print s1

执行结果(正确显示):

E:\>python test.py
你好

解释下上面的代码:#coding:gbk声明test.py文件编码为gbk,然后python2解释器就以gbk编码解析文件test.py,当遇到u’你好’ 字符串时,就将其从gbk转换为unicode编码,然后赋值给s1变量,最后输出到控制台,因为unicode码是通用码,输出到控制台时,会隐式转换为gbk,然后正确显示。

演示7:win7,系统字符集gbk,用notepad++新建test.py文件(编码方式使用utf-8),输入以下代码

#coding:utf-8
s1=u'你好'

print s1

执行结果(正确显示):

E:\>python test.py
你好

解释下上面的代码:#coding:utf-8声明test.py文件编码为utf-8,然后python2解释器就以utf-8编码解析文件test.py,当遇到u’你好’ 字符串时,就将其从utf-8转换为unicode编码,然后赋值给s1变量,最后输出到控制台,因为unicode码是通用码,输出到控制台时,会隐式转换为gbk,然后正确显示。

python3.x

python3缺省使用utf-8处理数据,同时所有的字符串都是以unicode字符集编码。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Python中,字符串是由一系列字节组成的字节数组。当显示字符串时,需要将其解码为特定的字符编码才能正确显示。码通常是由于使用错误的字符编码或者编码转换异常引起的。 码的情况一般发生在以下两种情况下: 1. 字符编码不一致:当字符串的编码与控制台或其他输出设备的编码不一致时,会导致码。比如将使用GBK编码的字符串输出到UTF-8编码的控制台,或者将使用UTF-8编码的字符串输出到GBK编码的控制台都会导致码。 2. 编码转换异常:在进行字符串编码转换时,如果源字符串的编码格式不符合目标编码的要求,就会抛出编码转换异常,从而导致码的出现。 为了避免码问题,在处理字符串时,我们可以采取以下几个方法: 1. 确保输入和输出的设备使用相同的字符编码。比如,如果你的字符串使用GBK编码,那么你应该将控制台或其他输出设备的编码设置为GBK。 2. 在进行字符串编码转换时,使用正确的源编码和目标编码。可以使用Python的内置函数encode()和decode()来进行编码转换。 3. 使用Unicode字符串来避免编码问题。Unicode字符串是一种特殊的字符串类型,它可以包含任何字符,而不会出现编码问题。 总之,码问题在Python中是一个常见的问题,但通过正确的字符编码设置和编码转换方法,可以有效地解决码问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【Python】中文码问题与解决方案 深入分析](https://blog.csdn.net/Xuange_Aha/article/details/130441906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

历史五千年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值