精华内容
下载资源
问答
  • 本篇文章带领大家彻底搞懂Python字符编码的一些知识,及python字符编码的一些基础概念,需要的朋友可以参考下
  • 主要介绍了Python字符编码判断方法,结合实例形式分析了Python字符编码的判断技巧,并给出了chardet的安装与使用方法,需要的朋友可以参考下
  • Python的字符串编码规则一直让我很头疼,花了点时间研究了下,并不复杂,本文给大家介绍python字符编码,感兴趣的朋友一起学习吧
  • 本文不谈复杂的理论,就经验教大家字符处理八字真言:确定编码,同类交互。教大家快速战胜Python字符编码
  • Python字符编码

    千次阅读 2014-06-28 01:08:21
    在用python编程中,字符串有两种表示方法"string"和 u"string"。为什么字符串要是用这两种表达方式,不是只用前一种呢?...都说python脚本使用的是两字节编码,这又是指什么呢? 本文试图回答这些问题。

          在用python编程中,字符串有两种表示方法"string"和 u"string"。为什么字符串要是用这两种表达方式,不是只用前一种呢?

          使用type()函数查看,它们分别是str对象和unicode对象。这两个对象有什么区别吗?还有经常用到的encode()和decode()又是干什么的呢?都说python脚本使用的是两字节编码,这又是指什么呢?

         要回答上面几个问题,首先得弄清楚关于编码的几个概念:
    Character Set:字符集,是我们人可以识别的字符。如ASCII规定了127个用一个字节可以表示的字符集,包括英文字母、数字、符号和一些控制字符。当然ASCII定义的字符集比较小。python中的Character Set基本包括目前世界上所有是用的字符,如中文、英文、日文字符等等。所以基本上所有的字符都可在Python 中进行处理。
    Code Point :计算机是不能直接识别字符的(因为它只能直接识别二进制码),所以为了能让计算机处理和存储字符,需要将字符映射成一个数值(因为数值可以用二进制表达,计算机从而就可以识别了),这个数值叫作字符的code point。字符与其code point是一对一映射,Unicode很好的规定了这种映射关系。
    Encode:unicode虽然规定了每个字符的Code Point,但并没有规定计算机如何存储这些Code Point。所有就有了UTF-8、GBK、UTF-16等编码格式,它们规定计算机如何来存储这个Code Point,每个编码格式它们存储方式都是不相同的。例如,“中”字的Code Point为U +2D2E(U表示Unicode,2D2E表示该Code Point值),使用GBK、Big5、UTF-8、UTF-16四种编码协议对该Code Point进行编码,获得的实际二进制表示如下:
           GBK      Big5        UTF-8     UTF-16
     ~~\xD6\xD0  \xA4\xA4  \xE4\xB8\xAD  \x2D\x4E
    Decode:对实际的二进制进行解码,获取它所代表字符的Code Point。如“\xD6\xD0”使用GBK解码,将获得2D2E(“中”的Code Point ),如果使用UTF-8对其进行解码,就会出错,因为它不是用UTF-8编码的。

          上面简单介绍下字符及编码解码的概念,可参考博文《字符的编码与解码》
           Python中使用两种字符串表达方式,是为了区分字符与实际表示字符的二进制信息。unicode对象用来表示字符,它不涉及字符的底层的二进制编码信息。str对象是用来表示字符的二进制信息。一个unicode对象可以使用多种编码格式(如UTF8、GBK)编码(encode)成多个str对象,每个str对象表示该字符串的一种二进制表达。多个不同的str对象可以解码成相等的unicode对象(表示字符串相同,但内存位置不同)。
         unicode的存在也是为了解决因采用不同编码格式导致的一些问题,建议大家使用unicode对象来存放字符串,统一格式。unicode虽然不规定具体的二进制信息,但为了存放每个字符的Code Point值,需要两个字节,所以说Python采用的是二进制编码(不知道这么理解可对?)。
         由于str对象没有属性指定它的编码格式,所以对它进行处理时,只能将它看成一个字节串。当对str对象进行打印或解码时,且不知道它的编码格式,那么python只能用默认编码格式对其进行操作。如果编码不匹配,就会出现乱码或者报错。
    str对象:
    称字符串,它是字符串使用特定编码格式进行编码后的二进制表达,实际代表用于存储二进制信息的字节串。所以称它为“字节串”更合适。如
    >>> str = '你好'   #采用系统设定的编码格式对“你好”进行编码,可通过locale命令查看。
    >>> str
    '\xe4\xbd\xa0\xe5\xa5\xbd'    #当locale设置为utf8时,'你好'的编码后的二进制表达,一个六字节的字节串

    Unicode对象

    用于表达“字符”,因为计算机不用直接识别字符,所以使用Code Point来代替字符。如下:

    >>> u"你好"
    u'\u4f60\u597d'

    Code Point 4F60表示“你”,597d表示“好”。它只是一个数值与字符映射, 不用于具体编码。
           对一个str对象进行解码,可以获得它表达字符串的Code Point,即unicode对象。对unicode对象进行编码,可获得它的实际二进制表达,即str对象。当想把str对象从一中编码格式转换成另一种编码格式时,首先得把str转换成unicode对象,再从unicode对象转换成另外一种编码格式的str对象。下面执行一个str对象从utf8格式到gbk格式的转换:
    >>> str="你好"
    >>> str
    '\xe4\xbd\xa0\xe5\xa5\xbd'         # 采用OS的utf8编码格式
    >>> unicode=str.decode("utf8")     # 解码成Code Point值 
    >>> unicode
    u'\u4f60\u597d'
    >>> str_gbk=unicode.encode("gbk")  # 将Code Point编码成GBK格式
    >>> str_gbk
    '\xc4\xe3\xba\xc3'
    
    >>> unicode.encode()               # 如果编码不指定格式,将采用系统默认的编码格式进行编码。对于decode也一样。这里由于ASCII不能对中文字符编码,所以出错了。
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    
    >>> u = u"你好"     #前缀u自动把字符串从utf8转换成unicode格式了
    u'\u4f60\u597d'

    写文件:
    >>> file=open("test.txt", "a")
    >>> file.write(str)
    >>> file.write(str_gbk)
    >>> file.write(unicode)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    
           从上面看,UTF8格式的str对象和GBK格式的str对象成功的写入test.txt文件,然而在将unicode对象写入文件时,出现错误了。这是为什么呢?
           str对象表示字符串经编码后的二进制信息,可以直接写入文件。然后unicode对象表示的是字符串的Code Point值,是抽象的值,用来表示字符,是不能直接写入文件的。所以Python试图使用默认的编码格式ASCII,对unicode对象进行编码,然后将结果存入文件。但是由于ASCII不能对”你好”进行编码,所以报错了。

    修改系统默认编码格式:
    >>> import sys
    >>> reload(sys)
    <module 'sys' (built-in)>
    >>> sys.setdefaultencoding("gbk")  #不建议这么用[2]
    
    >>> str(unicode)      #使用默认GBK,对unicode("你好")进行编码,转成str对象
    '\xc4\xe3\xba\xc3'
    >>> unicode.encode()   #使用默认GBK,对unicode("你好")进行编码,转成str对象
    '\xc4\xe3\xba\xc3'
    
    >>> "你好".decode()    #因为系统使用UTF8,所以“你好”是UTF8格式的字节串,使用默认GBK对该字节串进行解码,虽然成功运行了,但其结果是不正确的。所以我们需要保证字节串用什么格式编码的,就要用什么格式解码。
    u'\u6d63\u72b2\u30bd'
     
     




    参考文献:
    [1] http://www.newsmth.net/bbscon.php?bid=284&id=84741
    [2] http://stackoverflow.com/questions/3828723/why-we-need-sys-setdefaultencodingutf-8-in-a-py-script
    [3] http://www.joelonsoftware.com/articles/Unicode.html
    [4] http://www.unicode.org/

    展开全文
  • 主要介绍了Python 字符编码与文件处理的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
  • 彻彻底底搞搞懂懂Python字字符符编编码码 本篇文章带领大家彻底搞懂Python字符编码的一些知识及python字符编码的一些基础概念需要的朋友可以参 考下 不论你 有着多年经验的 Python 老司机还 刚入门 Python 不久你...
  • 一、Python字符编码介绍 1、须知: 在python 2中默认编码是 ASCII,而在python 3中默认编码是 unicode unicode 分为utf-32 (占4个字节),utf-16(占两个字节),utf-8(占1-4个字节),所以utf-16 是最常用的unicode版本...
  • python字符编码惯用法

    千次阅读 2014-12-01 02:05:23
    本文总结在实际应用中遇到的python字符编码问题,制定一套编码相关的约定,避免编码上的错误。

    本文总结在实际应用中遇到的python字符编码问题,制定一套编码相关的约定,避免编码上的错误。

    在写猥琐宝典时需要总结soj上做过的题,准备在总结过程中顺便写一个soj上的题解。题解使用python可读,也就是python可以直接eval的格式,以便于处理。写题解老是copy soj上的题目id,title不是太方便,所以就准备自动生成一个空的题解,里面包含了我做过的题。然而直接从soj上只能拿到自己过了的题的id列表,缺乏其它信息。缺乏的信息可以抽象为soj数据库,其中包含了一个以id为主键的表,表中有题目所有的信息。于是代码分为两部分,一部分是soj的工具,其中包含了数据库操作,根据id获取AC的题目列表,另一部分是基于soj工具,负责题解数据的操作。

    学python比较晚,当时面临python2和python3的选择,看过一些区别,感觉python3的设计更加合理,而python2比较随意。尤其是字符串部分,python2的概念不清楚,把字节的序列和字符串混在一起,导致一些混乱。首先用python3写的工具,然后想把代码作为web后台,把结果以网页的形式展示出来,这就涉及到python2了,因为在生产环境中还是以python2为主。在转为python2的过程中,不得不重新审视一下字符串的部分,然后总结出这篇文章。

    在python2中使用string和unicode string类型,而在python3中则使用bytes和string类型,他们对等:python2.string = python3.bytes, python2.unicode string = python3.string。在python2中,感觉字符串相关东西混乱的原因在于命名失误:以偏概全,用的是string的名,表达的是bytes的概念。


    bytes的概念:
    bytes表达了字节为单位的序列,数据本身的意义很有限,只有当这些数据是按一定规则组织的,进而表达了某个概念,才存在编码问题,数据才有意义。

    比如我们可以认为bytes每4字节表示一个32位整数,其中整数每连续8位作为一个字节放在一起,且低位放在前面,这样的bytes就是有编码的,表达了32位整数的概念。

    同样的我们也可以认为bytes表示了utf8编码的字符串,每1到6个字节对应一个unicode字符,我们称bytes具有utf8编码,表达了字符串的概念。


    string的概念:
    如果要表达字符串概念,[Char]才是比较准确的(字符的列表)。至于一个Char占用多少存储,完全不知道。可以是utf16,用2或4字节表示一个Char,也可以是utf32用4字节表达一个Char,还可以是utf8用1到6字节来表示一个Char,这是实现者的事,不应该对我们的使用产生任何影响。

    所以,我们需要bytes用来表示string时,需要指定编码,将string转为bytes,对应的函数是encode。当我们认为bytes具有某个字符编码表达的是一个字符串的时候,通过decode并指定该编码得到string。严格地说来在python2中,我们不应该在string对象上调用encode方法,不应该在unicode string对象上调用decode方法。

    更进一步,任何抽象都可以encode得到对应的bytes,通过decode得到对应的抽象。

    在上述的基础上,引入一些编码约定,目标是避免编码错误。


    1.源代码编码,这个编码通过#coding:xxx指出,在python2和python3中概念都很明确。
    惯用法(约定):
    源代码只使用utf8编码。


    2.string literal的类型和编码:
    python2中一个形如"xxxx"的string literal具有string类型,编码和源代码编码一致。
    而形如u"xxxx"的string literal具有unicode string类型,存在一个自动的源代码编码向unicode string decode的过程。无法转换时会报错,这个时候需要查通过注释指出的编码以及源代码的真实编码。

    python3中一个形如"xxxx"的string literal具有string类型,此时,存在自动的源代码编码向unicode的decode过程。
    而b"xxxx"的string literal具有bytes类型,表示了源代码的一部分。所以,当其中内容是字符串时,我们也称之是一个和源代码编码一致的字符串。

    惯用法:
    python2中用string来表达字符串的概念,并使用utf8编码。而python2中unicode string和string混用时,string被认为具有源代码编码,并decode为unicode string。于是存在陷阱,使用的变量的类型失去控制,不知道是string还是unicode string,所以在这里要特别注意。如果用string表达字符串的概念,同时用其它编码,也是可以的,主要是看编码对应的字符集和应用是不是能很好结合在一起。

    而python3则string来表达字符串的概念,不关心编码问题。python3不存在混用问题,bytes和string一结合使用,就会报错。


    3.urlopen(xxx).read()后的处理:
    很明确,这里返回的概念是python3.bytes。
    如果确定返回的东西是一个网页的文本,我们可以调用decode(encoding='网页编码', errors='ignore')来得到对应的字符串。

    但是,注意2中python2的约定,我们的字符串的类型是python2.string的,所以在python2中在decode后我们还要有一个encode的过程:encode(encoding='源代码编码', errors='ignore')


    4.写数据文件:
    在这里写的是一个特殊的文件,文件可以被看成是一段python代码并执行,所以:

    惯用法:
    文件编码使用utf8。

    在python2中
    with open(file, 'wb') as tempf:
      tempf.write(data)
    with open(file, 'w') as tempf:
      tempf.write(data)
    都是可以的,因为string无法区别是字节还是字符串。

    而在python3中则要使用:
    with open(file, 'wb') as tempf:
      tempf.write(data.encode(encoding='utf8',errors='ignore'))

    with open(file, 'w') as tempf:
      tempf.write(data)
    因为前者写入的是bytes而后者是string。

    上述可行性是建立在我们约定数据文件和源代码编码都是utf8的情况下得到的,如果没有这些约定,我们看看这些代码的语义:

    python2中两份代码语义有点乱:
    如果已知data是一个字符串,那么第一份代码理论上错误,但是实际上两份代码都完成了把data写到文件,数据文件编码和data一致的目标。
    如果已知data是一个二进制流,那么第二份代码理论上错误,但是实际上两份代码也都完成任务,数据文件不存在编码问题。

    python3中第一份代码的语义是,写入data这个字符串,数据文件编码是utf8。
    而第二份代码语义是:写入data这个字符串,数据文件编码和当前源文件编码(在这是认为默认编码等于当前源文件编码)一致。


    5.读数据文件:
    惯用法:
    在python2中
    with open(file, 'rb') as tempf:
      tempf.read()

    with open(file, 'r') as tempf:
      tempf.read()
    均可,因为前者返回一些字节,但是用的是string作容器。而后者返回的还是string。

    而在python3中则要用:
    with open(file, 'rb') as tempf:
      tempf.read().decode(encoding='utf8',errors='ignore')

    with open(file, 'r') as tempf:
      tempf.read()
    因为打开的模式不同,前者返回了bytes,后者返回的是string(在内部尝试bytes尝试用源文件encoding解码)。

    同样的这些代码的可行性也是建立在若干约定的基础上,如果没有这些约定,也来看看其语义:

    python2中第一份代码的语义是读回一些二进制数据。
    python2中第二份代码的语义是读入一些字符串。(理论上会有一个先读二进制再根据当前默认编码decode然后再向当前默认编码encode的过程,但是在这里认为两个变换是恒等的,所以没动作。显然,在出现非法字符的情况下,两个变换不恒等。)

    python3中第一份代码的语义是读入二进制数据,根据utf8进行decode。
    python3中第二份代码的语义是隐式地读入二进制数据,根据当前默认编码进行decode。

    在我的应用场景里,读回的数据还有个eval的过程。显然,python2直到eval才可能出现编码错误,而python3能更早发现错误。

    展开全文
  • 如果是现在正在用Python2的人应该都知道存在字符编码问题,就举一个最简单的例子吧:Python2是无法在命令行直接打印中文的,当然他也是不会报错的,顶多是一堆你看不懂的乱码。如果想在直接显示中文,我们是可以在...
  • Python字符编码确实是一个让人头疼的问题,但是只要使用正确的方式,还是可以较好解决的。

    Python的字符编码问题是一个很大的坑,特别是对于Python 2.X而言。造成这个问题的主要原因是我们没有统一的编码。

    0x01 编码操作

    这里我不讲编码的原理,简单易懂的可以看这里:字符串和编码
    Python中的编码,其实可以粗分为两大类:Unicode和非Unicode。相互之间可以利用encode和decode进行转换。

    #coding:utf-8
    
    #前面限定了是utf-8
    utf8_str='test'
    #unicode字符串
    unicode_str=u'测试'
    #相互转换
    utf8_str.decode('utf-8')
    unicode_str.encode('utf-8')

    0x02 编码识别

    对于一段字符串,我们有时候并不好确定它真实的编码方式,最简单的办法就是使用chardet进行识别。

    安装:

    pip install chardet

    使用起来也很简单:

    #coding:utf-8
    
    from chardet import detect
    import urllib2
    
    html=urllib2.urlopen('http://www.baidu.com').read()
    print detect(html)

    结果:

    {'confidence': 0.99, 'encoding': 'utf-8'}

    confidence显示的是别正确的概率。encoding是识别的结果。

    0x03 需要注意的问题

    (1)对字符串进行操作,比如拼接等,需要编码格式一致。这个很好理解,就不再赘述;
    (2)当需要保存文本文件的时候,有时候并不知道是什么编码方式,建议使用二进制方式:

    import urllib2
    
    html=urllib2.urlopen('http://www.baidu.com').read()
    with open('baidu.txt','wb') as f:
        f.write(html)

    (3)有些特殊的字符串可能非常奇怪,导致Python转换过程中无法处理,这种情况我们可以使用decode的特殊处理方法:

    #coding:utf-8
    
    test='u123\x01\u0000特殊'
    print test.decode('utf-8','ignore')

    (4)Windows系统的编码平台可能比较特殊,导致容易出现乱码,我们可以对字符串的输入输出这么处理:

    import sys
    
    #输出打印:info是unicode编码
    def new_print(info):
        print info.encode(sys.stdin.encoding)
    
    #解码为unicode编码
    def new_input(info):
        print info.decode(sys.stdin.encoding)

    0x04 后记

    Python字符编码确实是一个让人头疼的问题,但是只要使用正确的方式,还是可以较好解决的。希望上面的内容对大家有所帮助。

    展开全文
  • python字符编码的判断

    千次阅读 2016-12-09 18:58:34
    最近需要使用字符串来解决一些问题,中间牵涉到使用url,而url的编码方式往往... 使用python自带的字符编码方式判断函数isinstance(字符串,编码方式),可以判断字符串string是否为给定的编码方式。  也可以使用py

           最近需要使用字符串来解决一些问题,中间牵涉到使用url,而url的编码方式往往又是不同于平时所使用的编码方式的,这里就需要检测一下url所使用的编码方式,然后将url的编码方式转换为所需要的编码方式,然后再参与后续的运算

          使用python自带的字符串编码方式判断函数isinstance(字符串,编码方式),可以判断字符串string是否为给定的编码方式。

          也可以使用python的一个常用的模块chardet来进行检测,使用方法也是很简单的,实地操作了一下感觉还是很不错的

    chardet的安装也是很简单的:pip install chardet即可

    直接上代码

    # !/usr/bin/python
    #-*-coding:utf-8-*-




    import chardet


    def detection(path = 'dataset/black.txt'):
    f = open(path)
    f_list = f.readlines()
    result = []
    for url in f_list:
    url_dict = {}
    url_dict = chardet.detect(url)
    if url_dict['encoding'] != 'ascii':
    print url, url_dict
    result.append(url)
    print 'result is :', result
    #print url, chardet.detect(url)





    detection('dataset/all.txt')


    学习后感觉很棒


    展开全文
  • Python 字符编码问题全面总结
  • Python 字符编码判断

    千次阅读 2018-01-12 16:26:29
    在获取中文字符的时候,如果出现乱码的情况,我们需要了解当前的字符串的编码形式。使用下面两种方法可以判断字符串的编码形式。 法一: isinstance(s, str) 用来判断是否为一般字符串 isinstance(s, unicode)...
  • python 字符编码出现的问题 IDLE 一定要设置啊!!!!!!! python 字符编码出现的问题 IDLE 一定要设置啊!!!!!!! python 字符编码出现的问题 IDLE 一定要设置啊!!!!!!! python 字符编码出现的...
  • Python字符编码转换Unicode和str

    千次阅读 2019-09-28 04:59:31
    参考链接1:https://blog.csdn.net/VictoriaW/article/details/75314737 参考链接2:...Unicode和str ## str 我们平时写的用引号括起来的字符串都是str类型的。 >>> x = '哈哈' ...
  • python字符编码错误的解决方案

    千次阅读 2015-11-02 15:44:31
    第一条:SyntaxError: Non-ASCII character '\xc4' in file E:\***.py on line 3, but no encoding ... see http://python.org/dev/peps/pep-0263/ for details。 [解决方案] 在文件头上添加一行 #coding:utf-8
  • python字符编码检测——chardet

    千次阅读 2012-04-15 14:24:17
    分类: 我的python新生 2012-04-01 15:36 21人阅读 评论(0) 收藏 举报  当面对一串不知道编码信息的字节流的时候,尝试着确定... Firefox包含有一个自动检测字符编码的库,导入到了python2,并且取绰号为chardet模块
  • Python字符编码与正则表达式指南

    千次阅读 2014-04-12 14:28:42
    1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码。计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的...
  • 17.python字符编码检测——chardet

    千次阅读 2012-04-01 15:36:24
    当面对一串不知道编码信息的字节流的时候... Firefox包含有一个自动检测字符编码的库,导入到了python2,并且取绰号为chardet模块  chardet运用了一种算法来检测字符的类型 import chardet utf8_str = '我爱pytho
  • Python 3的字符串使用Unicode,直接支持多语言。 1、ASCII、Unicode、UTF-8 ASCII编码和Unicode编码的区别:ASCII编码是1个字节,扩展ASCII码是从128-255的字符。而Unicode只是一个符号集,通常是2个字节。 本着...
  • ascii编码,Unicode和UTF-8之间的关系1,ascii编码,这是一种单字节编码,8位,一个char的长度。最多可以存放255中不同的字符。对于早期的计算机系统来说,对于应付英文字符和一些符号绰绰有余了。 事实上基本的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 201,032
精华内容 80,412
关键字:

python字符编码

python 订阅