python :codecs模块简介

python :codecs模块简介转载自 http blog csdn net suofiya2008 article details python 对多国语言的处理是支持的很好的 它可以处理现在任意编码的字符 这里深入的研究一下 python 对多种不同语言的处理 有一点需要清楚的是 当 python 要做编码转换的时候 会借助于内部的编码 转换过程是这样的 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 原有编码 gt 内部编码 gt 目

转载自:http://blog.csdn.net/suofiya2008/article/details/

python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理。

有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码,转换过程是这样的:

        原有编码 -> 内部编码 -> 目的编码 

 python的内部是使用unicode来处理的,但是unicode的使用需要考虑的是它的编码格式有两种,一是UCS-2,它一共有65536个码 位,另一种是UCS-4,它有g个码位。对于这两种格式,python都是支持的,这个是在编译时通过–enable- unicode=ucs2或–enable-unicode=ucs4来指定的。那么我们自己默认安装的python有的什么编码怎么来确定呢?有一个 办法,就是通过sys.maxunicode的值来判断:

python :codecs模块简介 import   sys
python :codecs模块简介
  print   sys.maxunicode

python :codecs模块简介   =       风卷残云   
python :codecs模块简介
  print   type(a)
python :codecs模块简介 b 
  =   a.unicode(a,     gb2312    )
python :codecs模块简介
  print   type(b)

python :codecs模块简介   =   b.encode(    utf-8    )
python :codecs模块简介
  print   c

# 
-*- encoding: gb2312 -*- 


import 
 codecs, sys



print 
  
 
 
 
* 
60 


# 
 创建gb2312编码器 


look   
= 
 codecs.lookup( 
 
gb2312 
 
)

# 
 创建utf-8编码器 


look2  
= 
 codecs.lookup( 
 
utf-8 
 
)



 
= 
  
 
我爱北京 
 



print 
 len(a), a

# 
 把a编码为内部的unicode, 但为什么方法名为decode呢,我 的理解是把gb2312的字符串解码为unicode 


 
= 
 look.decode(a)

# 
 返回的b[0]是数据,b[1]是长度,这个时候的类型是unicode 了 


print 
 b[ 
1 
], b[0], type(b[0])

# 
 把内部编码的unicode转换为gb2312编码的字符 串,encode方法会返回一个字符串类型 


b2  
= 
 look.encode(b[0])

# 
 发现不一样的地方了吧?转换回来之后,字符串长度由14变为了7! 现在 的返回的长度才是真正的字数,原来的是字节数 


print 
 b2[ 
1 
], b2[0], type(b2[0])

# 
 虽然上面返回了字数,但并不意味着用len求b2[0]的长度就是7了, 仍然还是14,仅仅是codecs.encode会统计字数 


print 
 len(b2[0])

python :codecs模块简介 #  -*- encoding: gb2312 -*- 
python :codecs模块简介
  import   codecs, sys
python :codecs模块简介
python :codecs模块简介

  #   用codecs提供的open方法来指定打开的文件的语言编码,它会在读 取的时候自动转换为内部unicode 
python :codecs模块简介
  bfile   =   codecs.open(    dddd.txt        r        big5    )
python :codecs模块简介
  #  bfile = open(“dddd.txt”, ‘r’) 
python :codecs模块简介
 
python :codecs模块简介 ss 
  =   bfile.read()
python :codecs模块简介 bfile.close()
python :codecs模块简介

  #   输出,这个时候看到的就是转换后的结果。如果使用语言内建的open函数 来打开文件,这里看到的必定是乱码 
python :codecs模块简介
  print   ss, type(ss)

 

——————————————————————————————————————————————————







字符的编码是按照某种规则在单字节字符和多字节字符之间进行转换的某种方法。从单字节到多字节叫做decoding,从多字节到单字节叫做 encoding。在这些规则中经常用到的无非是UTF-8和GB2312两种。
 
在Python中,codecs模块提供了实现这些规则的方法,通过模块公开的方法我们能够方便地获取某种编码方式的Encoder和 Decoder工厂函数(Factory function),以及StreamReader、StreamWriter和StreamReaderWriter类。
 
使用“import codecs”导入codecs模块。
 
codecs模块中重要的函数之一是lookup,它只有一个参数encoding,指的是编码方式的名称,即utf-8或者gb2312等 等。如下示例:

>>> import codecs
>>> t = codecs.lookup("utf-8" )
>>> print t
(

,

,

,

)



 
>>> encoder = t[0]
>>> decoder = t[1]
>>> StreamReader = t[2]
>>> StreamWriter = t[3]






lookup函数返回一个包含四个元素的TUPLE,其中t[0]是encoder的函数引用,t[1]是decoder的函数引用,t[2] 是UTF-8编码方式的StreamReader类对象引用,t[3]是UTF-8编码方式的StreamWriter类对象引用相信对Python熟悉 的你肯定知道接下来该怎么用它们了。
 
codecs模块还提供了方便程序员使用的单独函数,以简化对lookup的调用。它们是:
  • getencoder(encoding)
  • getdecoder(encoding)
  • getreader(encoding)
  • getwriter(encoding)
如果我们只是想获取一种utf-8编码的encoder方法,那么只需要这样做:

>>> encoder = codecs.getencoder("utf-8" )

 
另外,对于StreamReader和StreamWriter的简化, codecs模块提供一个open方法。相对于built-in对象File的open方法,前者多了三个参数encoding, errors, buffering。这三个参数都是可选参数,但是对于应用来说,需要明确指定encoding的值,而errors和buffering使用默认值即 可。使用方法如下:

>>> fin = codecs.open("e://mycomputer.txt" , "r" , "utf-8" )
>>> print fin.readline()
这是我的电脑 
>>> fin.close()


 
总结一下,codecs模块为我们解决的字符编码的处理提供了lookup方法,它接受一个字符编码名称的参数,并返回指定字符编码对应的 encoder、decoder、StreamReader和StreamWriter的函数对象和类对象的引用。为了简化对lookup方法的调用, codecs还提供了getencoder(encoding)、getdecoder(encoding)、getreader(encoding)和 getwriter(encoding)方法;进一步,简化对特定字符编码的StreamReader、StreamWriter和 StreamReaderWriter的访问,codecs更直接地提供了open方法,通过encoding参数传递字符编码名称,即可获得对 encoder和decoder的双向服务。


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199763.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午12:16
下一篇 2026年3月20日 下午12:16


相关推荐

  • a算法求解八数码问题_a*算法解决八数码问题python

    a算法求解八数码问题_a*算法解决八数码问题python前面见过宽度优先搜索和深度优先搜索求解八数码问题。那两个方法都是盲目搜索。今天看启发式搜索。A算法:利用评价函数来选择下一个节点。图引用自-北京联合大学彭涛老师在中国慕课的《人工智能概论》。估价函数没有定论,可以有不同方法。这里采用处在错误位置的数字的数量。代码在:github一组测试数据的执行搜索的过程如下:A*算法(宽度优先)求解八数码问题==========宽度优先求解八数码问题,搜索过程是==========[[203..

    2025年7月17日
    7
  • JavaScript中prototype用法

    JavaScript中prototype用法1概述大部分面向对象的编程语言,都是以类class作为对象的基础语法,js语言不是如此,它的面向对象编程基于‘原型对象’。首先说说构造函数的缺点:js通过构造函数生成新的对象,因此构造函数可以视为独享的模版。实例对象的属性和方法,可以定义在构造函数内部概述构造函数的缺点JavaScript通过构造函数生成新对象,因此构造函数可以视为对象的模板。实例对象的属性和方法,可以定

    2022年7月22日
    15
  • Spring Boot 实现在线Web SSH( Java Web版本的Xsehll)

    Spring Boot 实现在线Web SSH( Java Web版本的Xsehll)前言之前讲过 我现在在一家国企上班 由于集团网络环境是封闭的内网 平时的部署上线 日志排查是通过一个跳板堡垒机去连接内网机器 大致情况如下图 以及联想到 Alibaba 开源的 Java 诊断工具 Arthas 其 WebConsole 在浏览器上就可以执行命令 操作简单 界面也非常的 nice 然后就想着去实现一个自己的 WebSSH 去探究其内部的原理 扩展 什么是堡垒机堡垒机 即在一个特定的网络环境下 为了保障网络和数据不受来自外部和内部用户的入侵和破坏 而运用各种技术手段监控和记录运维人员对网络内的

    2026年3月16日
    2
  • 测试工程师常见面试题及答案_测试工程师数据库面试题

    测试工程师常见面试题及答案_测试工程师数据库面试题1、测试人员在软件开发过程中的任务是什么?(初级)(5分)答:1、寻找Bug;2、避免软件开发过程中的缺陷;3、衡量软件的品质;4、关注用户的需求。总的目标是:确保软件的质量。2、在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?(初级)(6分)答:一条Bug记录最基本应包含:编号、Bug所属模块、Bug描述、Bug级别、…

    2025年6月10日
    4
  • java sdk下载_Java SDK的下载、安装和环境配置

    java sdk下载_Java SDK的下载、安装和环境配置1 必应 搜索 JavaSDK2 如图 选择 Download 目前最新版本是 14 01 选择合适的下载 3 创建文件夹 如图 依次创建 Java SDK jdk 文件夹 4 打开下载的安装包 开始安装安装 jdk 把 jdk 安装在事先创建好的文件夹中安装完成后关闭安装完成后 Java11 及之后的版本没有 jre 只有 jdk 我们可以通过命令生成 jre 1 通过 win10 自带的搜索工具 搜索 cmd 由于我的安装

    2026年3月26日
    2
  • 公网IP、私网IP和IP分类

    公网IP、私网IP和IP分类0 源于 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp IP 查询是一个经常性的操作 Windows 平台可以在 cmd 中通过 ipconfig 查询 linux 则在终端中输入 ifconfig 发现我的 IP 通常是因为我到处蹭网 192 168 10 xxx 不是说 IP 地址全球唯一吗 怎么还有多个相同网段的 IP 呢 nbsp nbsp nbsp amp n

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号