位置: 编程技术 - 正文

深入浅析Python字符编码(用python怎么写字)

编辑:rootadmin

推荐整理分享深入浅析Python字符编码(用python怎么写字),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python文字,python汉字字符串,python文字处理,python文字处理,python字号,python教程文字版,python 中文字体,python文字处理,内容如对您有帮助,希望把文章链接给更多的朋友!

Python的字符串编码规则一直让我很头疼,花了点时间研究了下,并不复杂。主要涉及的内容有常用的字符编码的特点,并介绍了在python2.x中如何与编码问题作战,本文关于Python的内容仅适用于2.x,3.x中str和unicode有翻天覆地的变化,具体请查阅相关资料。

1. 字符编码简介

1.1. ASCII

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

1.2. MBCS

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

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

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

1.3. Unicode

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

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

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

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

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

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

BOM_UTF8 'xefxbbxbf' BOM_UTF_LE 'xffxfe' BOM_UTF_BE 'xfexff'

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

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

2. Python2.x中的编码问题

2.1. str和unicode

str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对UTF-8编码的str'汉'使用len()函数时,结果是3,因为实际上,UTF-8编码的'汉' == 'xE6xB1x'。

深入浅析Python字符编码(用python怎么写字)

unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'汉') == 1。

再来看看encode()和decode()两个basestring的实例方法,理解了str和unicode的区别后,这两个方法就不会再混淆了:

需要注意的是,虽然对str调用encode()方法是错误的,但实际上Python不会抛出异常,而是返回另外一个相同内容但不同id的str;对unicode调用decode()方法也是这样。很不理解为什么不把encode()和decode()分别放在unicode和str中而是都放在basestring中,但既然已经这样了,我们就小心避免犯错吧。

2.2. 字符编码声明

源代码文件中,如果有用到非ASCII字符,则需要在文件头部进行字符编码的声明,如下:

#-*- coding: UTF-8 -*-实际上Python只检查#、coding和编码字符串,其他的字符都是为了美观加上的。另外,Python中可用的字符编码有很多,并且还有许多别名,还不区分大小写,比如UTF-8可以写成u8。参见 :)

2.3. 读写文件

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

另外,模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

2.4. 与编码相关的方法

sys/locale模块中提供了一些获取当前环境下的默认编码的方法。

3.一些建议

3.1. 使用字符编码声明,并且同一工程中的所有源代码文件使用相同的字符编码声明。

这点是一定要做到的。

3.2. 抛弃str,全部使用unicode。

按引号前先按一下u最初做起来确实很不习惯而且经常会忘记再跑回去补,但如果这么做可以减少%的编码问题。如果编码困扰不严重,可以不参考此条。

3.3. 使用codecs.open()替代内置的open()。

如果编码困扰不严重,可以不参考此条。

3.4. 绝对需要避免使用的字符编码:MBCS/DBCS和UTF-。

这里说的MBCS不是指GBK什么的都不能用,而是不要使用Python里名为'MBCS'的编码,除非程序完全不移植。

Python中编码'MBCS'与'DBCS'是同义词,指当前Windows环境中MBCS指代的编码。Linux的Python实现中没有这种编码,所以一旦移植到Linux一定会出现异常!另外,只要设定的Windows系统区域不同,MBCS指代的编码也是不一样的。分别设定不同的区域运行2.4小节中的代码的结果:

可见,更改区域后,使用mbcs解码得到了不正确的结果,所以,当我们需要使用'GBK'时,应该直接写'GBK',不要写成'MBCS'。

UTF-同理,虽然绝大多数操作系统中'UTF-'是'UTF--LE'的同义词,但直接写'UTF--LE'只是多写3个字符而已,而万一某个操作系统中'UTF-'变成了'UTF--BE'的同义词,就会有错误的结果。实际上,UTF-用的相当少,但用到的时候还是需要注意。

python开发之字符串string操作方法实例详解 本文实例讲述了python开发之字符串string操作方法。分享给大家供大家参考,具体如下:在python中,对于字符串string的操作,我们有必要了解一下,这样

python开发之函数定义实例分析 本文实例讲述了python开发之函数定义方法。分享给大家供大家参考,具体如下:下面是我做的几个用列:#python中的函数定义,使用和传参def_str='''python

Python中Class类用法实例分析 本文实例讲述了Python中Class类用法。分享给大家供大家参考,具体如下:尽管Python在FunctionProgramming中有着其他语言难以企及的的优势,但是我们也不要

标签: 用python怎么写字

本文链接地址:https://www.jiuchutong.com/biancheng/378586.html 转载请保留说明!

上一篇:python开发之for循环操作实例详解(python,for循环)

下一篇:python开发之字符串string操作方法实例详解(python中的字符型)

  • 缴纳印花税的会计科目
  • 关税纳税申报时间
  • 筹建期的开办费计入什么科目
  • 小微企业免增值税2023年政策
  • 标书的资金类型是什么
  • 财政补贴金额
  • 增值税留抵怎么填申报表
  • 厂家核销费用直接抵扣
  • 远期转账支票怎么取钱
  • 软件开发公司的运营模式
  • 公司未分配利润太大,怎么处理好
  • 委托贷款利息收入现金流
  • 个人应纳税所得额怎么算
  • 免征增值税还要做销项税吗
  • 个体户开票要交印花税?
  • 委托加工物资的消费税
  • 收据和发票有什么区别图片
  • 第三方贴现分录
  • 企业成本费用包括哪些
  • 工程已验收,质量问题怎么解决
  • 购买国外技术需要缴纳什么税
  • 调整低电量通知怎么设置
  • 在win7中,当前窗口的数量是多少个
  • 应收账款借贷方向表示什么意思
  • 委外加工费用会计分录
  • 网络限速数值
  • 苹果手机nfc录门禁卡
  • 多缴纳税款
  • 赊销商品属于什么信用
  • PHP:imagefontwidth()的用法_GD库图像处理函数
  • 企业出售房产土地增值税怎么计算
  • 带着崽崽宠老公免费阅读
  • 厂房改造支出可以计入厂房价值吗
  • mac环境搭建
  • thinkphp6 数据库
  • 虚开增值税怎么查到的
  • php xml转字符串
  • ICLR2023《Crossformer: Transformer Utilizing Cross-Dimension Dependency for Multivariate Time Series》
  • vue3版本网页小游戏
  • linux部署tomcat的war包
  • tracetcp命令
  • 其他综合收益要结转到本年利润吗
  • 应付账款转入营业外收入会计分录
  • 零星开支是什么会计科目
  • 什么经营范围可以开门票发票
  • 甲企业持有乙企业股票的市价为920000
  • 长期借款期末余额表示什么
  • 钢管租赁怎么算的
  • 企业购买商品房作为职工宿舍
  • 税务机关如何对个人股东股权财务报表审核
  • 承租人收到融资租赁款
  • 保障房异地建设费属不属于土地成本
  • 财务费用在贷方负数表示什么
  • 计提工资的会计处理
  • 向客户收取贴纸费用怎么说
  • 工资计提数小于发放数,如何处理
  • 进项税留抵怎么做分录
  • 无发票的费用怎么处理
  • 速动比率特别高的原因
  • sqlserver中with(nolock)深入分析
  • sqlserver 触发器 redis
  • mysql怎么清理干净
  • 神州战神bios怎么进
  • upskill
  • win7鼠标右键没有压缩文件
  • 交换机操作系统版本
  • win8系统gho
  • macos卸载java
  • win10怎么解除网吧下载限速
  • WinXp x64sp企业订户最新完整纯净版安装指南
  • win7 windows安全
  • linux查看开机运行时间
  • Win10预览版桌面图标和任务栏不翼而飞怎么办?
  • linux系统入侵检测软件有哪些
  • express的中间件
  • 点击android
  • Please ensure that adb is correctly located at 'D:Androidandroid-sdkplatform-toolsadb.exe' and
  • 成都市电子税务局网上申报
  • 陕西税务局如何缴纳社保
  • 江苏国税电子国税局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设