`
provista
  • 浏览: 121858 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

理解python的unicode字符串

阅读更多
# -*- coding:gb2312 -*-
 
if __name__=='__main__':
    print "-------------code 1----------------"
    a = "和谐b你b可爱女人"
    print a
    print a.find("你")   #index=5,对于一般字符串,按照了
                        #指定的编码方式(这里为gb2312)
                        #并不像unicode字符串一样,把任何字符视为长度1,
                        #而是视为字节长度(5=2+2+1).
    b = a.replace("爱", "喜欢")
    print b
    print "--------------code 2----------------"
    x = "和谐b你b可爱女人"
    print a.find("你")
    y = unicode(x) #此处将x解码(成字符串),如果有编码第二参数,应该和第一行指示编码相同
    print y
    print y.encode("utf-8") #若和指示编码不一样,则会打印乱码
    print y.encode("gb2312")
    
    print y.find(u"你")  #index=3,因为unicode字符都视为1长度
    z = y.replace(u"爱", u"喜欢小")
    print z.encode("utf-8")
    print z.encode("gb2312")
    print "---------------code 3----------------"
    print y
    newy = unicode(x,"gb2312") #如果和指示编码行的指示不一样的话,将报错
    print newy

输出:
引用

-------------code 1----------------
和谐b你b可爱女人
5
和谐b你b可喜欢女人
--------------code 2----------------
5
和谐b你b可爱女人
???b浣????濂充??
和谐b你b可爱女人
3
???b浣????娆㈠?濂充??
和谐b你b可喜欢小女人
---------------code 3----------------
和谐b你b可爱女人
和谐b你b可爱女人


utf-8版本的编码指示行:
# -*- coding:utf-8 -*-

if __name__=='__main__':
    print "-------------code 1----------------"
    a = "和谐b你b可爱女人"
    print a
    print a.find("你")   #index=7,对于一般字符串,按照了指定的编码方式(这里为utf-8)
                        #并不像unicode字符串一样,把任何字符视为长度1,
                        #而是视为字节长度(7=3+3+1).
    b = a.replace("爱", "喜欢")
    print b
    print "--------------code 2----------------"
    x = "和谐b你b可爱女人"
    print a.find("你")#同----code 1----,index=7
    y = unicode(x) #此处将x解码(成字符串),如果有编码第二参数,应该和第一行指示编码相同
    print "直接print::",y
    print "若和指示编码不一样,以下两行有一行会打印乱码"
    print "UTF-8::",y.encode("utf-8") 
    print "GB2312::",y.encode("gb2312")
    
    print y.find(u"你")  #index=3,因为unicode字符都视为1长度
    z = y.replace(u"爱", u"喜欢小")
    print "若和指示编码不一样,以下两行有一行会打印乱码"
    print z.encode("utf-8")
    print z.encode("gb2312")
    print "---------------code 3----------------"
    print "直接print::",y
    newy = unicode(x,"gb2312") #如果和指示编码行的指示不一样的话,将报错
    print newy

输出:
引用
-------------code 1----------------
和谐b你b可爱女人
7
和谐b你b可喜欢女人
--------------code 2----------------
7
直接print:: 和谐b你b可爱女人
-----若和指示编码不一样,以下两行有一行会打印乱码----
UTF-8:: 和谐b你b可爱女人
GB2312:: ��гb��b�ɰ�Ů��
3
----若和指示编码不一样,以下两行有一行会打印乱码-----
和谐b你b可喜欢小女人
��гb��b��ϲ��СŮ��
---------------code 3----------------
直接print:: 和谐b你b可爱女人
Traceback (most recent call last):
  File "E:\JavaWork\WorkForLab\PythonStarter\src\LangProbe\__init__.py", line 28, in <module>
    newy = unicode(x,"gb2312") #如果和指示编码行的指示不一样的话,将报错
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 0-1: illegal multibyte sequence



我的解释......还请各位指出谬误.

笔者使用的文本物理编码始终是utf-8,但是对指示行编码进行了更改操作.看起来:
虽然,如果在eclipse编辑器中改掉第一行的编码指定为一个不兼容的编码,比如"utf-8"->"gbk",那么保存后整个文件就会出乱码.但是这是eclipse的python编辑器的特性,如果再将事先预存的无乱码的内容覆盖拷回代码中,程序仍将正常显示和运行,而且查看文件发现物理编码并无改变.因此,文本的物理编码和python指示行的编码实际上并不干扰,是两回事.
(有趣的是,在eclipse中改变了一次指示行编码保存后(utf8到gb2312),代码显示为乱码,如果再改回,则eclipse报错,因为按乱码显示的文本无法再保存,编码已被破坏;如果再ctrl-z回退,使得指示行再为utf-8保存,文件显示为之前不是乱码的状态,保存,eclipse不报错,但是查看此时物理编码变成了ANSI)

硬盘阶段:
    *.py文件编码是utf-8,然后eclipse内置文本编辑器能够正确地以此编码读入内存,交给python解释器程序(本示例中文件编码是utf-8).
内存中python解释器阶段:
    python解释器看到第一二行有编码指示行,则把程序代码编码成该指示编码.(本示例1中,就是gb2312;示例2中是utf-8).
内存中运行时阶段
    运行时遇到一般字符串,则按照解释器的编码读入,print直接把此编码字节推送OS打印.若遇到unicode字符串,无编码参数创建的,则按照 程序开头第一行的指示编码创建;若有编码参数则此参数必须和第一行指示编码参数相同或者兼容,否则程序报错,因为python会直接把一般字符串的字节(已为指示行编码)强行解码为语句指定编码来构造unicode字符,一般会失败.相同了之后,print这个unicode字串,python将以系统(系统语义:到底是那个级别的系统)默认编码来解码显示,如果系统默认编码不支持unicode字符,比如ascii,那么显然会出错.
分享到:
评论
1 楼 kndroid 2012-08-11  
Thanks

相关推荐

    C语言字符串转换为Python字符串的方法

    如果C语言字符串是UTF-8编码的,可以使用Py_BuildValue()函数来构建一个Unicode字符串,例如: ```c PyObject *obj = Py_BuildValue("s#", s, len); ``` 其中,`s`是指向UTF-8编码的C语言字符串数据的指针,`len`是...

    python统计字符串中中英文、空格、数字、标点个数

    首先,我们需要理解Python中处理字符串的基本方法。字符串在Python中是不可变序列,可以通过索引来访问和操作其各个字符。对于统计任务,我们可以遍历字符串的每个字符,然后通过条件判断来确定其类型。 1. **检查...

    python去掉 unicode 字符串前面的u方法

    Python是一种广泛使用的高级编程语言,它支持Unicode字符串,这是为了存储和处理文本数据。Unicode字符串在Python中通过在字符串前加小写"u"前缀表示。例如,"u'你好'"是一个Unicode字符串。然而,有时我们需要将...

    Unicode和字符串

    在编程世界中,字符编码是基础且至关重要的概念,尤其是Unicode和字符串的处理。...了解如何正确处理Unicode字符串,以及在各种编程语言中操作字符串的方法,将有助于开发出更健壮、更国际化的产品。

    PythonUnicode字符1

    #### 四、Python中Unicode字符串表示方法 在Python中,可以使用多种方式表示Unicode字符串: 1. **直接使用中文或其他语言字符**: ```python s = '你好世界' print(s) ``` 输出结果为:`你好世界` 2. **...

    python对象转json字符串小工具

    因此,当Python的Unicode字符串被转换为JSON时,会自动进行编码。如果在源码中看到了对Unicode对象的特殊处理,可能是在确保所有字符串都正确地转化为UTF-8编码,以符合JSON的标准。 以下是一个基本的例子,展示...

    Python原始字符串与Unicode字符串操作符用法实例分析

    本文实例讲述了Python原始字符串与Unicode字符串操作符用法。分享给大家供大家参考,具体如下: #coding=utf8 ''''' 在原始字符串里,所有的字符串都是直接按照字面的意思来使用, 没有转义特殊或不能打印的字符。 ...

    Python 字符串深度总结_Python 字符串深度总结

    在Python编程语言中,字符串是数据类型之...通过以上内容,我们对Python字符串有了全面而深入的理解,这有助于我们在实际编程中更高效地处理文本数据。在日常开发中,灵活运用这些知识能大大提高代码的可读性和实用性。

    Python2与Python3关于字符串编码处理的差别总结

    在Python2中,有两种类型的字符串:普通字符串(str)和Unicode字符串(unicode)。普通字符串str默认使用ASCII编码,这意味着它只能表示128个基本的ASCII字符。Unicode字符串则使用Unicode编码,可以通过前缀u来...

    Python3字符串学习教程

    通过本教程的学习,你应该能够理解 Python3 中字符串的基本概念和使用方法,掌握了字符串的创建、连接、操作以及与之相关的内置函数和模块。这些技能对于编写高效且可维护的 Python 代码至关重要。未来的学习中,你...

    python去除删除数据中\u0000\u0001等unicode字符串的代码

    ### Python去除删除数据中\u0000\u0001等Unicode字符串的代码 在进行文本处理时,经常会遇到一些特殊字符或者控制字符,这些字符可能会干扰数据处理流程,导致解析错误或显示异常等问题。在Python中,\u0000 和 \u...

    字符串与Unicode互转工具

    在许多语言中,如Java、Python和Delphi,字符串是不可变的,这意味着一旦创建,就不能更改其内容。 接下来,我们进入Unicode的世界。Unicode是一种字符编码标准,旨在为世界上几乎所有的字符提供一个唯一的数字表示...

    Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】

    - 文中提到了两个在线工具:在线字数统计工具和在线字符统计与编辑工具,这些工具可以帮助用户更好地理解和使用字符串统计功能。 通过上述介绍,我们可以看到统计字符串中字符出现次数的方法多种多样,可以根据...

    python源码字符串处理技术

    1. 字符串的创建和编码:在Python中,字符串可以通过单引号、双引号或三引号创建,并且支持Unicode编码,可以存储各种语言和特殊符号。 2. 字符串的连接和重复:通过加号(+)可以连接多个字符串,通过乘号(*)...

    HTML中unicode字符串转UTF-8

    在Python中,可以使用`str.encode('utf-8')`将Unicode字符串编码为UTF-8。 在处理网页内容时,确保正确的字符编码非常重要,因为它直接影响到用户的阅读体验。开发者需要理解Unicode和UTF-8之间的关系,以及如何在...

    python的字符串内建函数方法

    Python中的字符串内建函数方法是Python编程语言中处理文本数据的重要工具。自Python 1.6版本以来,这些方法不断得到增强和完善,直至Python 3.7,它们提供了丰富的功能,涵盖了字符串操作的各个方面,包括格式化、...

    Python之字符串和编码共13页.pdf.zip

    本篇文章将深入探讨Python中的字符串和编码,旨在帮助你更好地理解和运用这些关键概念。 1. **字符串基础知识** 在Python中,字符串是由一个或多个字符组成的序列。它们可以包含字母、数字、标点符号,甚至是特殊...

    022.Python字符串_unicode字符集_三种创建字符串方式_len() 音频已提取.mp4

    022.Python字符串_unicode字符集_三种创建字符串方式_len() 音频已提取.mp4

    计算机二级python题库-基本操作题之Unicode字符.zip

    在Python中,`encode`函数可以将Unicode字符串转化为特定编码的字节串,而`decode`函数则能将字节串解码回Unicode。例如: ```python unicode_str = "中国" encoded_bytes = unicode_str.encode("utf-8") decoded_...

Global site tag (gtag.js) - Google Analytics