Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python之中文乱码解决方案

Python之中文乱码解决方案

作者头像
苦叶子
发布于 2023-06-09 07:34:47
发布于 2023-06-09 07:34:47
1.6K0
举报
文章被收录于专栏:开源优测开源优测

在Python2.X及Python3有时经常碰到各种中文乱码的情况,这里整理了相关各种情况汇总。

字符串在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。 (与代码本身的编码是一致的!) 测试: 我的eclipse里面代码为utf-8编码的。然后我这样写代码 s="你好" s=s.decode('gb2312').encode('utf-8') print s 报错: UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3: illegal multibyte sequence 原因:因为我的文件为UTF-8编码的。所以你想用gb2312将其转成unicode是不可能的。 所以正确的写法应当是: s="你好" print s s=s.decode('utf-8').encode('utf-8') 要用UTF-8来做编码 print s 哈哈发现打印出来的是乱码那只能说明一件事情就是我的eclipse控制台是GB2312的编码! 请看: 如何获得系统的默认编码? #!/usr/bin/env python #coding=utf-8 import sys print sys.getdefaultencoding() 该段程序在英文WindowsXP上输出为:ascii 。我发现我的linux上面也是ascii编码。所以我想打印出来看到的乱码是正常的。因为我其实是utf-8编码的。 在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。(是的。我的eclipse控制台就是gb2312的编码所以我文件保存为utf-8的时候然后再通过打印是乱码了!) 1、读文件命令肯定是: myfile = codecs.open("c.html","r","utf-8") 因为我用gb2312来读的话报错 心得:检查一个字符串是什么编码只需要看一下decode 如果用gb2312来decode没报错的话就表示是gb2312 如果用utf-8来decode没有报错的话就表示是utf-8 现在遇到一个问题就是 请看: myfile = codecs.open("c.html","r","utf-8") str = myfile.read() content = str.replace("\n"," ") content = content.encode('utf-8') print content 没有报错 再看: myfile = codecs.open("c.html","r","utf-8") str = myfile.read() # 显示中文 content = str.replace("\n"," ") content = content.encode('gb2312') # 用gb2312 print content 报错:UnicodeEncodeError: 'gb2312' codec can't encode character u'\u2014' in position 12628 再看: myfile = codecs.open("d.html","r","utf-8") str = myfile.read() #显示中文 content = str.replace("\n"," ") content = content.encode('gb2312') # 用gb2312 print content 没问题 myfile = codecs.open("d.html","r","utf-8") str = myfile.read() #显示中文 content = str.replace("\n"," ") content = content.encode('utf-8') print content 也没问题 结论:我想是c.html页面里面 存在某些 特殊字符 只支持utf-8编码。而不支持gb2312的编码! 而d.html没有这种特殊字符。这也就解释了为什么 有的文件并没有发生我们想像中的问题! 所以我感觉打开文件肯定是用utf-8来读取得到一个unicode编码值! 然后对其做utf-8的编码处理。因为如果你做gb2312处理的话就会报错了! 接着: 我看了一下我的正则表达式发现如果用gb2312做解码处理的话一样会报错。所以断定肯定是utf-8编码了!

regex3 = regex3.decode('utf-8') print type(regex3) # 返回为unicode码了! print regex3 # 居然打印为正常的中文显示了 奇怪

尝试解决办法: 1、全部用unicode处理 即正则我用regex3 = regex3.decode('utf-8') 将其处理成 unicode编码了。然后内容也 print type(content) 也是unicode编码。结果还是不行! 难道是我的linux终端的编码引起的吗?我看了一下 locale 发现是GBK的终端的。即只有GBK编码才能显示出来为中文的! 于是我将 regex3 = regex3.decode('utf-8').encode('gb2312') 编码成gb2312结果可以显示中文! OK。我又将我的内容也一起弄成GB2312 content = content.encode('gb2312','ignore') print content 也可以成功打印出来中文。 我想这个时候应该没有什么问题了吧。结果一用正则又死掉了。昏死!!!!!!! 换另外一个好的文件测试下看看:换了之后发现没死而且成功了! 所以我觉得:肯定是这个文件里面的某些内容与正则匹配出现了冲突!导致的! 继续跟踪: 出现如下的情况 myfile = codecs.open("01.htm","r","utf-8","ignore") str = myfile.read() content = str.replace("\n"," ") print type(content) #发现是unicode码 regex3 = 'class=wpcpsCSS>([^<]+)(?:.*?wpcppb_CSS> ([0-9]+) </span>)?.*?(?:.*?(已被关闭))?.*?([0-9]+)个回答.*?([0-9]+)次浏览.*?(?:<div class=wpcptfCSS>.*?user\?userid=([0-9]+).*?>(.*?)</a> </div>.*?)?(?:user\?userid=([0-9]+)")? class="wpfitCSS[^"]+">([^<]+).*?class=wpcptsCSS>([^<]+).*?([0-9.]{9,}\*).*?class=wpcpdCSS>(.*?)</div> <div class=wpcpfCSS>' content = content.encode('utf-8') p=re.compile(regex3) results = p.findall(content) 没有什么问题可以成功出来结果。但是我 将content = content.encode('gb2312') 的话就发现 死掉了! 说明我的内容content与我的正则的编码其实是不一样的! 我现在将我的正则也调成gb2312来测试。结果发现可以出来。而且我的结果 results = p.findall(content) for ele in results: print ele[0],ele[1],ele[2],ele[3],ele[4],ele[5],ele[6],ele[7],ele[8],ele[9],ele[10] 在eclipse(默认为gb2312)下面也是没有问题的了!~ 所以我想:如果content是GBK那正则的内容也应当是GBK 即两者的编码一定要保持一致!否则就会出现死掉程序的情况! 现在我这样来处理 全部使用unicode编码处理 myfile = codecs.open("right.html","r") str = myfile.read() content = str.replace("\n"," ") content = content.decode('utf-8','ignore') #使用utf-8解码出来 都使用unicode编码吧 现在正则也用 regex3 = regex3.decode('utf-8','ignore') 使用utf-8搞成unicode编码 OK现在再来测试! 结论: 解决正则出现中文的BUG结论: 1、打开文件 myfile = codecs.open("right.html","r") 不需要设置其编码的! 设置编码格式 str = myfile.read() content = str.replace("\n"," ") content = content.decode('utf-8','ignore') #使用utf-8解码成unicode格式 正则: regex3 = regex3.decode('utf-8','ignore') #正则也统一使用utf-8解码成unicode格式 然后就可以 p=re.compile(regex3) results = p.findall(content) 调用正则了! 这样我就不用担心说 因为编码问题导致出来的错误。 Python之所以出现100%的CPU消耗原因在于 我的正则里面有一个死循环一直出不来。汗!!!!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源优测 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python字符串编码及乱码解决方案
http://blog.csdn.net/pipisorry/article/details/44136297
全栈程序员站长
2022/09/06
2.2K0
python字符串编码及乱码解决方案
python encode和decode函数说明
如上面代码,str\str1\str2均为字符串类型(str),给字符串操作带来较大的复杂性。
极简小课
2022/06/21
2.5K0
python encode和decode函数说明
python笔记5-python2写csv文件中文乱码问题
本文介绍了Python2写入CSV文件时中文乱码问题的原因、解决方案和具体操作步骤。首先介绍了CSV文件中中文乱码问题的原因,然后给出了两种解决方案。在方案一中,介绍了如何对字符串进行编码处理。在方案二中,介绍了如何使用codecs库的open方法来指定打开文件的语言编码,从而解决中文乱码问题。
企鹅号小编
2017/12/29
2.5K0
python笔记5-python2写csv文件中文乱码问题
Python 编码转换与中文处理
python 中的 unicode是让人很困惑、比较难以理解的问题. 这篇文章 写的比较好,utf-8是 unicode的一种实现方式,unicode、gbk、gb2312是编码字符集.
bear_fish
2018/09/19
3.7K0
python模块之codecs
python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码 位,另一种是UCS-4,它有2147483648g个码位。
周小董
2019/03/25
3.4K0
python编码问题之\"encode\"&\"decode\"
python encode decode 编码 decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。 encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。 当我们想获取网页源代码,并且希望能够以html后缀或者其他格式保存文件的时候,如果不进行编码,那么保存得到的文件
marsggbo
2018/01/23
1K0
Python2中文处理纪要
python2不是以unicode作为基本代码字符类型,碰到乱码的几率是远远高于python3,但即便如此,相信很多人,也不想随意的迁移到python3,这里就总结几个我平常碰到的问题及解法。 文件中无法使用中文注释 处理方法: 在代码中增加# -*- coding=UTF-8 -*-,一般加在文件头部第一行,如果第一行是脚本标志,则放在第二行(实际仍然是python正本的第一行)。 随后将文件另存为UTF-8格式。 此方法可以解决注释中有中文,及字符串立即数中包含中文的问题。 unicode中文变
俺踏月色而来
2018/06/20
6490
真棒!彻底解决了一直困扰的编码问题
在批量处理文件(后缀包括 ".csv"、".xlsx"、".xls"的文件)时,可能会出现同一个文件夹内同时存在不同编码的文件;亦或非"utf-8"格式的其他格式,即便相同格式也会出现有些文件能打开,而有些文件不能打开。
数据STUDIO
2021/06/24
1.3K0
Python的codecs模块
上面的代码就是codecs的使用,是最常见的用法。另外还有一个问题就是,如果我们处理的文件里的字符编码是其他类型的呢?这个读取进行做处理也需要特 殊的处理的。codecs也提供了方法.
狼啸风云
2021/05/13
2K0
字符、字符集、编码,以及它们python中会遇到的一些问题(下)
在看了很多的博客文章之后,总结整理得到了以下文章,非常感谢这些无私奉献的博主! 文章末尾有本文引用的文章的链接,如果有漏掉的文章引用,可以发邮件联系我,随后再次附上链接! 侵删!!! 这一部分是下篇,主要讲的是编码部分,以及在python中会遇到的一些编码问题,偏向于实际应用一点。 上篇介绍了字符、字符集的一些概念,以及他们在python中的一些简单的代码示例,偏向于概念。 上篇地址:http://www.cnblogs.com/echo-coding/p/7435118.html 这绝对是个源
Echo_fy
2018/06/20
2K0
python中codecs模块_python自然语言编码转换模块codecs介绍
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理。
全栈程序员站长
2022/07/28
3760
Codecs模块[通俗易懂]
这篇文章主要介绍了python自然语言编码转换模块codecs介绍,codecs专门用作编码转换,通过它的接口是可以扩展到其他关于代码方面的转换,需要的朋友可以参考下。
全栈程序员站长
2022/07/31
4040
你还在为Python中文乱码而感到烦恼?今天老司机给你讲讲!
有没有遇到过这样的问题,读取文件被提示“UnicodeDecodeError”、爬取网页得到一堆乱码,其实这些都是编码惹的祸,如果不能真正理解编码的问题所在,就像开车没有带导航,游泳没有带有度数的眼镜。如果你正在为此而 头疼,不妨来看看这篇文章,里面或许有你要的答案。
QQ1622479435
2018/07/21
1.3K0
python3编码问题终结者--还搞不懂你来找我
python unicode bytes str 编码 首先需要说明一下,该篇文章是以python3为基础的,python2是否适合没有验证过。 由于python编码问题确实比较多,文章篇幅可能较长,请耐心看完,绝对物超所值,何况还是免费的,只求转载的时候注明出处,谢谢! 一、 简单的编码介绍 平常我们可能听说过很多编码格式,如 ASCII码,Unicode,utf-8,gbk等等。为了不让文章臃肿,所以在这不再赘述,如想了解,请跳转到这个链接。 各种字符编码介绍 但是py3里,只有 unicode编码格式
marsggbo
2018/01/23
3.4K0
python3编码问题终结者--还搞不懂你来找我
python encode和decode函数说明[通俗易懂]
如上面代码,str\str1\str2均为字符串类型(str),给字符串操作带来较大的复杂性。
全栈程序员站长
2022/09/07
1.5K0
JSP中文乱码的产生原因及解决方案
JSP中文乱码的产生原因及解决方案在JSP的开发过程中,经常出现中文乱码的问题,可能一直困扰着大家,现在把JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。首先需要了解一下Java中文问题的由来: Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文
java达人
2018/01/31
3.6K0
python读取中文txt文本
字符串在Python2.7内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码成unicode,再从unicode编码成另一种编码。
py3study
2020/01/03
2.5K0
python 字符编码处理总结
python中经常遇到这样那样的字符编码问题,尤其在处理网页源码时(特别是爬虫中):
昱良
2018/09/29
6340
python2.7 的中文编码处理,解决UnicodeEncodeError: 'ascii' codec can't encode character 问题
最近业务中需要用 Python 写一些脚本。尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 很快,我就遇到了异常: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128) 为了解决问题,我花时间去研究了一下 Python 的字符编码处理。网上也有不少文章讲 Python 的字符编码,但是我看过一遍,觉得自己可以讲得
用户1214487
2018/05/28
16.3K0
python中encode和decode的区别_python lstrip
unicode编码方案: unicode只规定了每个字符所对应的码值(码点),即编码,但并没有规定如何在计算机中实现。同一个字符,可通过utf-8、utf-16、utf-32、gb2312(对中文)等多种方式各自实现。encode()方法就是将unicode编码方式转化为对应的实现方式,而decode()相反,将实现方式转化为编码。
全栈程序员站长
2022/11/09
5910
python中encode和decode的区别_python lstrip
相关推荐
python字符串编码及乱码解决方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档