【Python】中文乱码问题与解决方案 深入分析

这篇具有很好参考价值的文章主要介绍了【Python】中文乱码问题与解决方案 深入分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢?

【Python】中文乱码问题与解决方案 深入分析

在本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下:
1. UNICODE (UTF8-16),C854;
2. UTF-8,E59388;
3. GBK,B9FE。

一、python中的str和unicode

一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢?
在python中提到unicode,一般指的是unicode对象,例如'哈哈'的unicode对象为

u'\u54c8\u54c8'

而str,是一个字节数组,这个字节数组表示的是对unicode对象编码(可以是utf-8、gbk、cp936、GB2312)后的存储的格式。这里它仅仅是一个字节流,没有其它的含义,如果你想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示。
例如:
 

【Python】中文乱码问题与解决方案 深入分析

对于unicode对象哈哈进行编码,编码成一个utf-8编码的str-s_utf8,s_utf8就是是一个字节数组,存放的就是'\xe5\x93\x88\xe5\x93\x88',但是这仅仅是一个字节数组,如果你想将它通过print语句输出成哈哈,那你就失望了,为什么呢?

因为print语句它的实现是将要输出的内容传送了操作系统,操作系统会根据系统的编码对输入的字节流进行编码,这就解释了为什么utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”,因为 '\xe5\x93\x88\xe5\x93\x88'用GB2312去解释,其显示的出来就是“鍝堝搱”。这里再强调一下,str记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。

这里再对print进行一点补充说明:当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转换成本地的默认编码(这仅是个人猜测)

二、str和unicode对象的转换

str和unicode对象的转换,通过encode和decode实现,具体使用如下:

【Python】中文乱码问题与解决方案 深入分析

将GBK'哈哈'转换成unicode,然后再转换成UTF8

三、Setdefaultencoding

【Python】中文乱码问题与解决方案 深入分析

如上图的演示代码所示:

当把s(gbk字符串)直接编码成utf-8的时候,将抛出异常,但是通过调用如下代码:

import sys

reload(sys)
sys.setdefaultencoding('gbk')

后就可以转换成功,为什么呢?在python中str和unicode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错,当设定当前默认编码为'gbk'后,就不会出错了。

至于reload(sys)是因为Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入。

四、操作不同文件的编码格式的文件

建立一个文件test.txt,文件格式用ANSI,内容为:

abc中文

用python来读取:

# coding=gbk

print(open("Test.txt").read())

结果:

abc中文

把文件格式改成UTF-8:

结果:

abc涓枃

显然,这里需要解码:

# coding=gbk

import codecs

print(open("Test.txt").read().decode("utf-8"))

结果:

abc中文

上面的test.txt我是用Editplus来编辑的,但当我用Windows自带的记事本编辑并存成UTF-8格式时,

运行时报错:

Traceback (most recent call last):

File "ChineseTest.py", line 3, in 

print open("Test.txt").read().decode("utf-8")

UnicodeEncodeError: 'gbk' codec can't encode character u'\ufeff' in position 0: illegal multibyte sequence

原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。

因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:

# coding=gbk

import codecs
data = open("Test.txt").read()

if data[:3] == codecs.BOM_UTF8:
    data = data[3:]
    print(data.decode("utf-8"))

结果:

abc中文

五、文件的编码格式和编码声明的作用

源文件的编码格式对字符串的声明有什么作用呢?这个问题困扰一直困扰了我好久,现在终于有点眉目了,文件的编码格式决定了在该源文件中声明的字符串的编码格式,例如:

str = '哈哈'
print(repr(str))

a.如果文件格式为utf-8,则str的值为:'\xe5\x93\x88\xe5\x93\x88'(哈哈的utf-8编码)

b.如果文件格式为gbk,则str的值为:'\xb9\xfe\xb9\xfe'(哈哈的gbk编码)

在第一节已经说过,python中的字符串,只是一个字节数组,所以当把a情况的str输出到gbk编码的控制台时,就将显示为乱码:鍝堝搱;而当把b情况下的str输出utf-8编码的控制台时,也将显示乱码的问题,是什么也没有,也许'\xb9\xfe\xb9\xfe'用utf-8解码显示,就是空白吧。>_<

说完文件格式,现在来谈谈编码声明的作用吧,每个文件在最上面的地方,都会用# coding=gbk 类似的语句声明一下编码,但是这个声明到底有什么用呢?到止前为止,我觉得它的作用也就是三个:

  1. 声明源文件中将出现非ascii编码,通常也就是中文;
  2. 在高级的IDE中,IDE会将你的文件格式保存成你指定编码格式。
  3. 决定源码中类似于u'哈'这类声明的将‘哈'解码成unicode所用的编码格式,也是一个比较容易让人迷惑的地方,看示例:
#coding:gbk

ss = u'哈哈'
print(repr(ss))
print('ss:%s' % ss)

将这个些代码保存成一个utf-8文本,运行,你认为会输出什么呢?大家第一感觉肯定输出的肯定是:

u'\u54c8\u54c8'

ss:哈哈

但是实际上输出是:

u'\u935d\u581d\u6431'

ss:鍝堝搱

为什么会这样,这时候,就是编码声明在作怪了,在运行ss = u'哈哈'的时候,整个过程可以分为以下几步:

1) 获取'哈哈'的编码:由文件编码格式确定,为'\xe5\x93\x88\xe5\x93\x88'(哈哈的utf-8编码形式)

2) 转成 unicode编码的时候,在这个转换的过程中,对于'\xe5\x93\x88\xe5\x93\x88'的解码,不是用utf-8解码,而是用声明编码处指定的编码GBK,将'\xe5\x93\x88\xe5\x93\x88'按GBK解码,得到就是''鍝堝搱'',这三个字的unicode编码就是u'\u935d\u581d\u6431',至止可以解释为什么print repr(ss)输出的是u'\u935d\u581d\u6431' 了。

好了,这里有点绕,我们来分析下一个示例:

#-*- coding:utf-8 -*-

ss = u'哈哈'
print(repr(ss))
print('ss:%s' % ss)

将这个示例这次保存成GBK编码形式,运行结果,竟然是:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xb9 in position 0: unexpected code byte

这里为什么会有utf8解码错误呢?想想上个示例也明白了,转换第一步,因为文件编码是GBK,得到的是'哈哈'编码是GBK的编码'\xb9\xfe\xb9\xfe',当进行第二步,转换成 unicode的时候,会用UTF8对'\xb9\xfe\xb9\xfe'进行解码,而大家查utf-8的编码表会发现,utf8编码表(关于UTF- 8解释可参见字符编码笔记:ASCII、UTF-8、UNICODE)中根本不存在,所以会报上述错误。

【Python】中文乱码问题与解决方案 深入分析

>>> 希望对你有帮助,如果你还有其他问题,可在评论区讨论~文章来源地址https://www.toymoban.com/news/detail-499664.html

到了这里,关于【Python】中文乱码问题与解决方案 深入分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • layui中文、以及图标乱码解决方案

    最终解决方案…手动对js文件中的中文,用unicode进行编码

    2024年02月11日
    浏览(26)
  • IDEA 控制台日志中文乱码解决方案

    老白新学JAVA,初用IDEA,控制台打印中文总是乱码,网上找了好多解决方法,都不好用,下面记录解决过程。 1.修改idea64.exe.vmoptions ,打开最后一行增加如下代码 idea快捷方式右键-属性-打开文件所有位置,找到idea的安装位置 2.设置IDEA编码格式, 依次打开file-setting-editor-file e

    2023年04月08日
    浏览(41)
  • IDEA 控制台输出中文乱码的简单解决方案

    很多人(包括我)在编程的时候可能会发现:在IDEA的控制台输出中文字符的时候,会出现乱码,如下图: 于是就在网上搜了很多教程,结果弄完了却还是不行。下面是我的解决方案: 其实,问题出在JDK上:JDK18开始,编码变成GBK了,不再是UTF-8,而IDEA的默认配置又是UTF-8,所

    2023年04月18日
    浏览(35)
  • 解决办法:IDEA 控制台中文乱码的几种解决方案

    如果没有进行适当的配置,IntelliJ IDEA 可能会导致控制台和配置文件中出现中文乱码等问题,这会严重干扰编码过程以及问题追踪。本文汇总了解决 IDEA 中常见中文乱码问题的方法,本文的解决办法为大家提供帮助。 在IDEA 控制台输出中文的时候,出现乱码,现象如下: 2.1

    2024年02月04日
    浏览(44)
  • Qt的TCP传输数据,出现中文乱码的解决方案

    Qt的TCP传输数据中文乱码的问题,可能是由于编码不一致导致的。可以尝试以下方法解决: 在发送数据之前,将中文字符串进行编码转换。例如,将QString类型的中文字符串转换成UTF-8编码的字节数组,可以使用QString的toUtf8()函数,示例代码如下: QString str = \\\"中文字符串\\\"; QB

    2024年02月09日
    浏览(48)
  • 关于ESP8266串口输出中文时出现乱码的解决方案

    本人之前并没有c语言的项目编程经验,第一次使用ESP8266以及Eclipse编程环境,因此犯了诸多新手会犯的错误,但在网上查找相关问题时发现许多初级错误并不能完整的找到解决办法,因此希望将个人踩过的坑分享出来,如果有初学者遇到类似问题可以得到较快解决方案。 日前

    2024年02月03日
    浏览(38)
  • Java文件下载中文文件名乱码的解决方案

      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作

    2024年02月13日
    浏览(35)
  • Vivado打开的工程文件的中文注释出现乱码解决方案

    有同学在使用vivado打开一些工程的时候,发现其中注释有乱码,现象如下图: 原因分析: 有的工程是从其他编码软件中移植而得,而工程V文件源码的代码部分在代码编辑软件中是可以通用的,由于注释部分含有中文,两款EDA软件对中文的字符编码格式不同,在工程移植到

    2024年02月11日
    浏览(28)
  • Base64:含中文参数转码,对方接受参数解码后,中文信息乱码的解决方案

    在用 Postman 调接口给对方发参数的时候,对方反应含中文参数的字段信息部分乱码(即中文乱码,数字等正常)。本文介绍了如何解决这个问题。 以下部分内容来自: Base64用法参考 :jdk1.8——Base64 Base64内容介绍 : 浅谈Base64编码规则 Base64是网络上最常见的用于传输8Bit字节

    2024年02月04日
    浏览(29)
  • Android Studio 控制台中文乱码,解决方案都在这里了,完美解决

    Android Studio 如果不进行配置的话,运行程序时控制台中文乱码问题会非常严重,甚至影响我们对信息的获取和程序的跟踪。 通过历年的开发经验,在本文中我总结出四点用于解决控制台中文乱码问题的方法,希望有助于大家。 注意 :下面根据我日常工作的经验总结,排序的

    2023年04月08日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包