python字符乱码的问题。

在这篇文章上转载的http://www.jb51.net/article/17560.htm,主要记录几个关键点



python文件如果定义

#coding=utf-8

#coding=gb2312

如:s='中文'

如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。

但是对于这种 str=u'中文' 就是按照unicode编码 


python内部标准码是unicode码,两个函数很重要

str.encode("hex") 把unicode字符串转成hex

str.decode("hex") 把hex字符串转成unicode


IDE的问题:在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。 

如在UliPad中运行如下代码:

s=u"中文"
print s      会提示:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。

将最后一句改为:print s.encode('gb2312')

则能正确输出“中文”两个字。

若最后一句改为:print s.encode('utf8')

则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。


unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码 

使用str.__class__可以查看str的编码形式



最后这段参考代码

#!/usr/bin/env python 
#coding=utf-8 
s="中文" 

if isinstance(s, unicode): 
#s=u"中文" 
print s.encode('gb2312') 
else: 
#s="中文" 
print s.decode('utf-8').encode('gb2312')


### 解决Python程序中的字符乱码问题 #### 设置源文件编码声明 当编写涉及非ASCII字符(如中文)的Python脚本时,在文件顶部添加如下UTF-8编码声明有助于防止解释器误判默认编码,从而减少潜在的乱码风险[^1]。 ```python # -*- coding: utf-8 -*- ``` #### 处理字符串编码解码错误 对于已经存在的含有乱码的数据流或变量内容,可以通过指定合适的原始编码格式来进行重新编码操作。例如,如果知道某串文本原本是以GBK形式存储,则可以先按此方式解码再转为更通用的标准如UTF-8输出: ```python text = "你好".decode('gbk', 'ignore').encode('utf-8') print(text) ``` 需要注意的是上述`.decode()` 和 `.encode()` 方法适用于 Python 2.x 版本;而在 Python 3.x 中由于内置支持 Unicode 字符集,默认情况下不需要显式调用这些函数除非特殊情况下的跨编码转换需求存在[^3]。 #### 文本文件读写的正确做法 为了避免在处理外部资源(比如TXT文档)过程中产生的乱码现象,建议打开文件时指明其内部使用的具体编码标准。下面给出一段示范代码展示如何安全地进行带有多字节字符集合(如汉字)的文件I/O操作: ```python with open('example.txt', mode='r', encoding='utf-8') as f: content = f.read() print(content) with open('output.txt', mode='w', encoding='utf-8') as out_file: out_file.write("测试文字") ``` 通过这种方式可以在很大程度上规避因系统环境差异而导致的不同平台间传输后的不可预见性问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值