python中文编码详解

Python 中文编码 在Python中处理中文编码主要涉及确保使用正确的编码设置,特别是在文件读取和写入操作中。Python 3.x默认使用Unicode编码,因此在大多数情况下,你不需要进行特殊处理。然而,在Python 2.x中,你需要确保在文件开头添加UTF-8编码声明,并在文件操作中指定正确的编码。通过遵循这些最佳实践,你可以有效地在Python中处理中文编码问题。 阅读详情

部分转自:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html

编码的历史

1.     ASCII

ASCII(American Standard Code forInformation Interchange),是一种单字节的编码。计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的控制符号。不过ASCII只用到了其中的一半(\x80以下),这也是MBCS得以实现的基础。

2.     MBCS

然而计算机世界里很快就有了其他语言,单字节的ASCII已无法满足需求。后来每个语言就制定了一套自己的编码,由于单字节能表示的字符太少,而且同时也需要与ASCII编码保持兼容,所以这些编码纷纷使用了多字节来表示字符,如GBxxx、BIGxxx等等,他们的规则是,如果第一个字节是\x80以下,则仍然表示ASCII字符;而如果是\x80以上,则跟下一个字节一起(共两个字节)表示一个字符,然后跳过下一个字节,继续往下判断。

 这里,IBM发明了一个叫Code Page的概念,将这些编码都收入囊中并分配页码,GBK是第932页,也就是CP932。所以,也可以使用CP932表示GBK。

 MBCS(Multi-Byte Character Set)是这些编码的统称。目前为止大家都是用了双字节,所以有时候也叫做DBCS(Double-Byte Character Set)。必须明确的是,MBCS并不是某一种特定的编码,Windows里根据你设定的区域不同,MBCS指代不同的编码,而Linux里无法使用MBCS作为编码。在Windows中你看不到MBCS这几个字符,因为微软为了更加洋气,使用了ANSI来吓唬人,记事本的另存为对话框里编码ANSI就是MBCS。同时,在简体中文Windows默认的区域设定里,指代GBK。

3.     Unicode

后来,有人开始觉得太多编码导致世界变得过于复杂了,让人脑袋疼,于是大家坐在一起拍脑袋想出来一个方法:所有语言的字符都用同一种字符集来表示,这就是Unicode。

 最初的Unicode标准UCS-2使用两个字节表示一个字符,所以你常常可以听到Unicode使用两个字节表示一个字符的说法。但过了不久有人觉得256*256太少了,还是不够用,于是出现了UCS-4标准,它使用4个字节表示一个字符,不过我们用的最多的仍然是UCS-2。

 UCS(Unicode Character Set)还仅仅是字符对应码位的一张表而已,比如"汉"这个字的码位是6C49。字符具体如何传输和储存则是由UTF(UCS Transformation Format)来负责。

 一开始这事很简单,直接使用UCS的码位来保存,这就是UTF-16,比如,"汉"直接使用\x6C\x49保存(UTF-16-BE),或是倒过来使用\x49\x6C保存(UTF-16-LE)。但用着用着美国人觉得自己吃了大亏,以前英文字母只需要一个字节就能保存了,现在大锅饭一吃变成了两个字节,空间消耗大了一倍……于是UTF-8横空出世。

 UTF-8是一种很别扭的编码,具体表现在他是变长的,并且兼容ASCII,ASCII字符使用1字节表示。然而这里省了的必定是从别的地方抠出来的,你肯定也听说过UTF-8里中文字符使用3个字节来保存吧?4个字节保存的字符更是在泪奔……(具体UCS-2是怎么变成UTF-8的请自行搜索)

 另外值得一提的是BOM(Byte Order Mark)。我们在储存文件时,文件使用的编码并没有保存,打开时则需要我们记住原先保存时使用的编码并使用这个编码打开,这样一来就产生了许多麻烦。(你可能想说记事本打开文件时并没有让选编码?不妨先打开记事本再使用文件-> 打开看看)而UTF则引入了BOM来表示自身编码,如果一开始读入的几个字节是其中之一,则代表接下来要读取的文字使用的编码是相应的编码:

    BOM_UTF8 '\xef\xbb\xbf'

   BOM_UTF16_LE '\xff\xfe'

   BOM_UTF16_BE '\xfe\xff'

 并不是所有的编辑器都会写入BOM,但即使没有BOM,Unicode还是可以读取的,只是像MBCS的编码一样,需要另行指定具体的编码,否则解码将会失败。

你可能听说过UTF-8不需要BOM,这种说法是不对的,只是绝大多数编辑器在没有BOM时都是以UTF-8作为默认编码读取。即使是保存时默认使用ANSI(MBCS)的记事本,在读取文件时也是先使用UTF-8测试编码,如果可以成功解码,则使用UTF-8解码。记事本这个别扭的做法造成了一个BUG:如果你新建文本文件并输入"姹塧"然后使用ANSI(MBCS)保存,再打开就会变成"汉a",你不妨试试


python中的编码

1.     python中的str和unicode

python中的字符串有两种:str和unicode。

str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。它们都有两个方法:encode和decode:

encode是指将unicode转换成其他格式的编码

decode是指将其他格式的编码转换成unicode

decode和encode示例代码:

#coding=utf-8

u1 = u’你好’
print repr(u1)
s = u1.encode(‘utf-8’)
print repr(s)
u2 = s.decode(‘utf-8’)
print repr(u2)
 输出:

u'\u4f60\u597d'
'\xe4\xbd\xa0\xe5\xa5\xbd'
u'\u4f60\u597d'
 需要注意的是,对str调用encode()方法是错误的,虽然实际上Python不会抛出异常,而是返回另外一个相同内容但不同id的str;对 unicode调用decode()方法也是这样。

 再来看一下str和unicode长度的区别:

#coding=utf-8

s1 = ‘你好’
s2 = u’你好’
print len(s1)
print len(s2)
输出6和2

 这是因为,s1其实是经过unicode编码后的字节序列,而UTF-8对“你好”这两个字,每个字都用了三个字节来表示,因而导致它的长度为6。

而s2是unicode,“你好”中的每一个字都对应一个unicode字符,所以长度为2。

2.     python字符编码声明

不管是str还是unicode,字符串在python内部的表示都是unicode编码,它相当于一种统一的中间编码。所以经常会需要从其他编码成unicode,或者从unicode解码到其他编码。这就意味着,对于代码文件,或者其他内容,不管这些内容的编码是ASCII还是UTF-8,python都会把这些内容转换成它所接受的编码—即unicode。

 现在试着把下面代码写到文件中,enc.py:

s1='你好'
s2=u'你好'
print repr(s1)
print repr(s2)
 执行脚本:python enc.py,出错了:
 File "enc.py", line 1
SyntaxError: Non-ASCII character '\xc4' infile enc.py on line 1, but no encoding declared; seehttp://www.python.org/peps/pep-0263.html for details
 这是因为python解析器读取代码文件本身时,会试图把它转成unicode。但是上面的代码文件中出现了中文,并且文件头上没有任何的编码声明,python就会试图采用默认的ASCII编码来把中文转成unicode,但是显然,ASCII无法将中文转成unicode,所以它报错了。

 我们在文件的第一行加上声明:

#coding=utf-8
(注:实际上Python只检查#、coding和编码字符串,其他的字符都是为了美观加上的。另外,Python中可用的字符编码有很多,并且还有许多别名,还不区分大小写,比如UTF-8可以写成u8。参见 http://docs.python.org/library/codecs.html#standard-encodings)

 输出:

'\xe4\xbd\xa0\xe5\xa5\xbd'
u'\u4f60\u597d'
另外需要注意的是声明的编码必须与文件实际保存时用的编码一致,否则很大几率会出现代码解析异常。现在的IDE一般会自动处理这种情况,改变声明后同时换成声明的编码保存,但文本编辑器控们需要小心。

OK,再改一下代码:

#coding=utf-8

s1 = '你好'
s2 = u'你好'
print s1
print s2

 再执行一下,输出了:

浣犲ソ
你好
 这里第一个“你好”变成乱码了。这是因为,python解析器看到了UTF-8的编码声明,于是把s1转换从UTF-8转换成了unicode。而调用print的时候,它又试图将由UTF-8解码成unicode的字符串编码成gbk(下面解释为什么会转成gbk)的字符串,这时就出现乱码了。

而s2本来就已经是unicode了,所以不会有影响。

 为什么print的时候要转成gbk呢,这里需要解释一下python中print的工作原理:

print只是把字节串传递给操作系统,而由操作系统决定以何种编码输出。对于普通的ASCII字节串,当然是直接输出。而对于unicode,就依赖于stdout的输出编码了。

控制台里默认的编码是gbk(可以通过查看cmd.exe窗口属性看到),所以它会试图把unicode编码成gbk。

(注意不同的编辑器,如vim,IDLE,Eclipse使用的输出编码都是不一致的。所以,在一个地方能正常输出中文,不代码在所有地方都能正常地输出中文)

 这里我们再改一下,直接把下面的代码在python的交互式shell中执行:

s1 = '你好'
s2 = u'你好'
print s1
print s2
为什么这时又都正确地输出了中文呢?

因为现在是在控制台,默认编码就是gbk。所以对于s1,它会从gbk解码到unicode。输出时再编码回gbk,这时就能正常地输出了。

3.     python读写文件

内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。write()写入时,如果参数是 unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成 unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。

#coding=utf-8

f = open(‘in.txt’)
line = f.read()
f.close()
print type(line) #输出type ‘str’
u1 = line.decode(‘gbk’)
f = open(‘out.txt’, ‘w’)
line2 = u1.encode(‘utf-8’)
f.write(line2)
f.close()
 另外,模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

 4.     数据库中使用中文

a. 设置mysql中的charset是UTF-8的,然后在python代码文件中设置#coding=utf-8。

b. 使用MySQLdb连接数据库时,要加上charset='utf-8'的选项,不然它会以默认的编码去读取数据库的内容。

确保了1和2之后,就能正常地读取中文数据了,示例代码见上一篇。

python3.6使用dubbo_telnet 问题TypeError及中文编码问题 已解决 dubbo_telnet在python3.6使用问题:TypeError: 'in <string>' requires string as left operand, not bytes。已解决 (python安装路径XXXXXXX) XXXXXXXX/lib/python3.6/telnetlib.py文件修改 1、write()函数修改: 2、read_un... 阅读详情

相关推荐

Ubuntu下JSON转TXT实战:用Python脚本批量处理活动数据集(含中文编码避坑)

本文详细介绍了在Ubuntu系统下使用Python脚本将JSON文件批量转换为TXT格式的实战方法,特别针对ActivityNet等大型数据集处理中的中文编码问题提供了避坑指南。通过环境准备、核心方法讲解、优化技巧和高级应用示例,帮助开发者高效完成数据格式转换任务。

weixin_30824479的博客 540

python入门必备:深入了解Python 中文编码

本文较为详细的介绍了python的中文编码,在Python中处理中文编码时需要了解常见的编码方式、指定正确的编码方式读写文件、正确地进行编码和解码操作等。熟练掌握这些操作,可以避免中文乱码问题,保证程序正常运行。

weixin_43170061的博客 1363

【ArcGIS遇上Python】ArcGIS Python中文编码问题案例详解

前面的文章《ArcGIS Python获取Shapefile矢量数据字段名称》我们已经学会了如何用 Python 获取中文路径下的shp数据的所有字段,英文没有问题,但是如果你输出中文路径下的数据字段, 就有可能会碰到中文编码问题。 Python 文件中如果未指定编码,在执行过程会出现报错: import arcpy shp = 'C:\data\地级市.shp' fields = arcpy.ListFields(shp) for f in fields: print f.name .

智慧空间实验室 2619

一篇文章彻底搞懂Python字符编码方式(中文编码,UTF-8,unicode,gb,gbk,中文乱码,爬虫中文乱码)

(中文编码,UTF-8,unicode,gb,gbk,中文乱码,爬虫中文乱码,文件读取乱码)

m0_58859743的博客 2万+

饥荒联机版Mod开发——modmain环境与API深度解析

本文深入解析饥荒联机版Mod开发中的modmain.lua环境与核心API,详细讲解环境表构建原理、API注册与调用时机,并提供高级开发技巧与最佳实践。通过源码分析和实际案例,帮助开发者掌握Mod开发核心技术,解决常见问题,提升开发效率与代码质量。

weixin_30312563的博客 433

ROS2 DDS中间件(图文并茂+超详细)

DDS 的目标场景在端上,致力于使端上的应用可以更容易的进行通信,由于它的完全分布式架构,可以方便的将端上的应用拆分为多进程架构,从而提高端的容错能力。从产品定位角度来讲,它和 Chromium 中的 mojo 都是端上的通信中间件,只不过 mojo 不强调分布式,内部集成了更多的特定于端上的机制,比如句柄的传输,消息的缓存等。但由于 mojo 生于 Chromium,目前官方并没有把它独立出来,所以用起来比较不方便。而 DDS 或许可以在简单的场景下作为 mojo 的替代品。

weixin_39939185的博客 5282

python 中文编码

1、参考:https://blog.youkuaiyun.com/weixin_39994949/article/details/110989657 2、代码: str_without_b = '\u00ce\u00de' str = str_without_b.encode('raw_unicode_escape') str.decode('gb2312')

XinShun的博客 606

Python新手必看:5分钟搞定睿尔曼机械臂基础控制(附代码示例)

本文为Python新手提供了快速上手睿尔曼机械臂基础控制的实战指南。通过详细的步骤讲解和代码示例,介绍了从环境搭建、网络配置、SDK安装到建立连接、执行关节运动(movej)、直线运动(movel)等核心控制指令的全过程,帮助零基础开发者快速实现机械臂的基础操控。

hp777的博客 328

Python中文文件处理中涉及的字符编码及字符集

在现在的互联网,字符编码是互联网信息交互的一个重要基础,各种语言都有支持信息编码的机制,Python也不例外。Python除了字符编码之外,对于字节码和字符串两种类型有严格区分,字符串是本地可以读取的信息,字节码既可以来源是本身是字节码的内容,也可以是字符串直接转换生成。 在中文环境下,主要用的编码有GBK、UTF-8、GB2312等,在Python中,主要使用encode将字符串转换成字节码,使...

老猿Python 2627

游戏封包抓取实战:雷电模拟器+ProxyDroid+查尔斯3.93+WPE全流程解析

本文详细解析了使用雷电模拟器、ProxyDroid、查尔斯3.93和WPE进行游戏封包抓取的全流程实战。通过环境搭建、代理配置与工具协同,手把手教你抓取HTTP/HTTPS及原始Socket数据,涵盖从流量转向、证书安装到数据分析和常见问题排查,是学习游戏网络协议分析与安全测试的实用指南。

u8v9w0x1y的博客 445

空间数据库(1):Arcgis10.2连接PostgreSQL9.1,创建空间数据库,导入空间数据

1、arcgis的安装对于gis人员来说想必并不陌生,此处就不赘述了。那么就先从PostgreSQL说吧,我这里用的是跟Arcgis desktop 10.2所支持的9.1或者9.2版本,大家也可以用相对应的更高的版本来配置,注意的是版本一定要相互匹配,不仅是Arcgis与PostgreSQL的匹配,还有PostgreSQL与PostGIS匹配。 按道理desktop是32位的,应该用PostgreSQL的32位,但是我实在找不到32位的PostGIS9.1,所以就用64位的吧,后面配置部分可能需

XIAOHUA的博客 1317

Python中文编码问题详解

中文编码问题是用中文的程序员经常头大的问题,在python下也是如此,那么应该怎么理解和解决python的编码问题呢? 我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各种编码,比如作为中国程序经常要面对的gbk,gb2312,utf8等,那这些编码是怎么转换成内部的unicode呢? 首先我们先看一下源代码文件中使用字符串的情况。源代码文件作为文本文件就必然

斜阳雨陌 514

R语言绘图进阶:五大工具高效组合多图(cowplot、patchwork、layout、par、gridExtra)

本文详细介绍了R语言中五大高效组合多图的工具:cowplot、patchwork、layout、par和gridExtra。针对不同场景提供了实用指南,帮助数据分析师解决图表排版难题,提升报告专业度。特别推荐cowplot用于ggplot2图形组合,patchwork提供最简洁语法,layout则支持完全自定义布局。

weixin_42544663的博客 288

python中文编码-python中文编码与json中文输出问题详解

前言python2.x版本的字符编码有时让人很头疼,遇到问题,网上方法可以解决错误,但对原理还是一知半解,本文主要介绍 python 中字符串处理的原理,附带解决 json 文件输出时,显示中文而非 unicode 问题。首先简要介绍字符串编码的历史,其次,讲解 python 对于字符串的处理,及编码的检测与转换,最后,介绍 python 爬虫采取的 json 数据存入文件时中文输出的问题。参考书...

weixin_37988176的博客 225

【卫星语音通信】神经网络语音编解码算法:AudioDec

最新研究表明,通过深度学习模型对语音信号进行智能压缩与重建,可在12 kbps码率下实现48 kHz采样率的高保真语音还原,其主观音质评分(MOS)可达3.9分(满分4.27分),远超传统参数编码技术。这意味着未来卫星电话的通话质量有望达到CD级水准,而蜂窝网络的语音业务带宽需求可降低60%以上,为蜂窝和卫星网络中的大规模物联网语音交互铺平道路。它的诞生为神经音频编解码技术带来了一次重要升级,有助于让未来实时语音交互更流畅、更清晰,也让我们进一步体验到人工智能与音频信号处理结合所带来的创新可能性。

u011376987的博客 1473

YOLOv5入门实践(2)——手把手教你利用labelimg标注数据集

YOLOv5入门实践第2步,手把手教你使用labelimg标注数据集

路人贾的博客 1万+

中文 python_Linux与Python中文编码详解

TL;DR:Linux乱码(如果之前没安装过)yum groupinstall chinese-supportvim /etc/sysconfig/i18n将LANG="Zn_CN.UTF-8"复制到末尾vim乱码step1:在控制台输入 vim /etc/vimrcstep2:将下面三行复制到文件末尾set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb23...

weixin_29216957的博客 836

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

详解 python 中文编码与处理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34166472的博客 189

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

详解python中文编码与处理

python遇到中文,尽快转成unicode格式,再进行后续的操作,最后在需要中文输出的时候,再转回相应的中文格式 注意:本文只是针对 python 2,在 python 3 中,编码方式与处理技巧有些许变化,具体请参考:Python 2 与 Python 3 的差异对比: http://my.oschina.net/leejun2005/blog/173553 一、使用中文字符在pyt

学无止境 1428

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

python编码格式的问题_关于python中文编码的问题详解及示例

编码一直是python编程里一个头疼的问题,随着python的不断更新,问题稍好,但是还未解决,针对这个问题,来看下以下关于编码内容,有没有大家需要的吧~我们已经介绍了如何用 Python 输出 "Hello, World!",英文没有问题,但是如果你输出中文字符 "你好,世界" 就有可能会碰到中文编码问题。Python 文件中如果未指定编码,在执行过程会出现报错:#!/usr/bin/pytho...

weixin_40006185的博客 162

python网址解码_Python使用urllib模块对URL网址中的中文编码与解码实例详解

URL网址链接中的中文编码说明中文的gbk(GB2312)编码: 一个汉字对应两组%xx,即%xx%xx中文的UTF-8编码: 一个汉字对应三组%xx,即%xx%xx%xx可以利用百度进行URL编码解码 默认gbkhttps://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BDpython3编码解码示例# -*- coding: utf-8 -*-# @File : u...

weixin_39653481的博客 329

python中文编码与处理详解(个人认为比较全面详细了)

注意:本文只是针对 python 2,在 python 3 中,编码方式与处理技巧有些许变化,具体请参考: Python 2 与 Python 3 的差异对比:http://my.oschina.net/leejun2005/blog/173553 一、使用中文字符 在python源码中如果使用了中文字符,运行时会有错误,解决的办法是在源码的开头部分加入字符编码的声明,下面是一个例子:...

wjy1208的专栏 1224

寻音捉影·侠客行环境配置详解:Python依赖、FFmpeg支持、中文编码避坑指南

本文介绍了如何在星图GPU平台自动化部署🗡️寻音捉影·侠客行(Shadow & Sound Hunter)镜像,快速搭建武侠风音频关键词检索工具。该镜像基于FunASR语音算法,可高效识别音频中的中文关键词,适用于会议纪要、视频剪辑等音频处理场景,显著提升内容检索效率。

weixin_34456923的博客 331

python图片处理与PDF生成程序详解

本文介绍了一个基于Python wxPython框架开发的桌面应用程序,能够解压ZIP文件中的图片,提供预览功能,并将选定的图片批量生成PDF文档。程序采用面向对象设计,包含中文编码处理、智能图片预览、PDF生成引擎等核心模块。技术亮点包括多层编码处理机制解决文件名乱码问题、LANCZOS重采样算法实现高质量图片缩放、智能PDF排版算法等。程序还注重错误处理、用户体验和内存管理,具有跨平台兼容性。该应用展示了wxPython GUI开发、图像处理和PDF生成技术的综合应用。

Winfredzhang的博客 829

这20个常规Python语法你都搞明白了吗?

还没关注?快动动手指!Python简单易学,但又博大精深。许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉。学海无涯,我们先来了解...

lsxxx2011的专栏 240
上一篇: python中mysql中文的读写
下一篇: Hadoop跑map-reduce任务时停滞不前的问题(二)
inte_sleeper
博客等级 码龄21年 73粉丝 73原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值