`
yimi128
  • 浏览: 56099 次
  • 来自: ...
社区版块
存档分类
最新评论

[转]理解python中的bytestring和unicode

阅读更多

编码的概念

首先让我们来了解一些有关编码的背景知识。在计算机世界中的,一个字节(byte)通常有8位(bit),能表示256个字符(character)。不过当今世界不同的语言中包含的文字成千上万,一个字节所能表示的字符个数远远不能满足实际的需要,所以我们要用更多的字节来表示更多的字符。用字节来表示字符的过程称之为编码。ASCII编码共有127字符,所以每个字符可以用一个字节表示。覆盖众多西欧语言的ISO-8859(Latin)系列编码是 ASCII编码的超集,每个字符也使用一个字节来表示,最多可以表示256个字符。在我们的国标码GB2312中,每个字符用两个字节表示。 Windows NT的内部使用UCS-2编码,也是双字节编码。Linux平台上流行的UTF-8编码是可变长编码,单字节兼容ASCII编码,双字节覆盖西欧语言,三字节用来编码中、日、韩(CJK)文字。

请看下面的图示,横列是字符串,竖列是相应编码后的字节序列,竖列框中用十六进制表示字节的值:

 

            +-+-+-+-+-+-+            +--+--+            +--+--+

ASCII    |p|y|t|h|o|n|   GB2312   |巨|蟒|    UTF-8   |巨|蟒|

+-+-+-+-+-+-+            +--+--+            +--|--+

| | | | | | |            |  |  |            |  |  |

+----+<---+ | | | | | |   +----+<--+  |  |   +----+<--+  |  |

|0x70|      | | | | | |   |0xbe|      |  |   |0xe5|      |  |

+----+<-----+ | | | | |   +----+      |  |   +----+      |  |

|0x79|        | | | | |   |0xde|      |  |   |0xb7|      |  |

+----+<-------+ | | | |   +----+<-----+  |   +----+      |  |

|0x74|          | | | |   |0xf2|         |   |0xa8|      |  |

+----+<---------+ | | |   +----+         |   +----+<-----+  |

|0x68|            | | |   |0xfe|         |   |0xe8|         |

+----+<-----------+ | |   +----+<--------+   +----+         |

|ox6f|              | |                      |0x9f|         |

+----+<-------------+ |                      +----+         |

|0x6e|                |                      |0x92|         |

+----+<---------------+                      +----+<--------+

编码方面就简单介绍到这了,下面进入python部分。

 

python中的bytestring

在python的交互模式下尝试输入下面的语句:

 

 >>> '\x41'

'A'

>>> '\172'

'z'

如上所示,在python字符串(这里的字符串都指单个引号包围的字符串)中,可以使用'\'来进行转义。'\x41'使用两位十六进制数来表示一个字节的值,在ASCII中代表'A'。'\172'使用三位八进制数来表示一个字节的值,在ASCII中代表'z'。

让我们来输入一些中文(windows下):

 

>>> bytestr = 'python巨蟒'

>>> bytestr

'python\xbe\xde\xf2\xfe'

>>> len(bytestr)

10

中文环境下,cmd的代码页是cp936(即是GBK编码,GB2312的扩展编码),每个汉字占两个字节。因此'python巨蟒'共10个字节,可以看出python中的字符串其实是字节串(byte string)。

 

python中的unicode

python 中除了byte string,还有unicode string。因为unicode大到足以容纳我们用到的所有字符,所以可以把unicode看成对字符的一种抽象表示。使用unicode的明显好处是可以处理更大的字符集,所以常常要把byte string转换成unicode string,这个过程称为解码。

现在让我们来对byte string进行解码,将其转换成unicode string

 

>>> bytestr = 'python巨蟒'

>>> unicodestr = bytestr.decode('cp936')

>>> unicodestr

u'python\u5de8\u87d2'

>>> len(unicodestr)

8

可以看到unicodestr的长度是8,和'python巨蟒'的字符个数一样。

也可以照下面这样做:

 

>>> bytestr = 'python巨蟒'

>>> unicodestr = unicode(bytestr, 'cp936')

之后,可以对unicode string进行不同格式的编码,转化为相应的byte string

 

>>> unicodestr.encode('cp936')

'python\xbe\xde\xf2\xfe'

>>> unicodestr.encode('utf-8')

'python\xe5\xb7\xa8\xe8\x9f\x92'

因为cmd的代码页是cp936,所以把unicodestr按utf-8编码后,会打印出的乱码字符

 

>>> utf8bytestr = unicodestr.encode('utf-8')

>>> utf8bytestr

'python\xe5\xb7\xa8\xe8\x9f\x92'

>>> print utf8bytestr

python宸ㄨ煉

 

python脚本中的编码指定

如果是在python的脚本文件中,可以在首行或者紧跟着#!行注明编码

 

# -*- encoding: utf-8 -*-

下面是一段脚本

# -*- encoding: utf-8 -*-

unicodestr = unicode('python巨蟒', 'utf-8')

print unicodestr

unicodestr = unicode('python巨蟒', 'cp936')

print unicodestr

unicodestr = u'python巨蟒'

print unicodestr

输出结果如下

python巨蟒

python宸ㄨ煉

python巨蟒

 

一个小问题

可以看到,u'python巨蟒'中的字符串被自动解码,转化为unicode,这是python中另一种定义unicode字符串的方式。不过这种方式在GUI shell下会有一些问题。比如在IDLE中输入u'巨蟒'结果如下:

 

>>> u'巨蟒'

u'\xbe\xde\xf2\xfe'

而在python的交互模式下就不会有问题:

 

>>> u'巨蟒'

u'\u5de8\u87d2'

GUI shell其实是使用code标准模块来进行read-eval-print loop的。

另外通过调用命令行"python -c command"来执行代码结果也是如此。在cmd中输入

python -c "for x in u'巨蟒': print hex(ord(x))"

结果是:

 

0xbe

0xde

0xf2

0xfe
分享到:
评论

相关推荐

    python3.x 将byte转成字符串的方法

    在Python3.x版本中,将字节串(byte)类型转换成字符串(string)类型是一个常见的操作,这在处理网络请求、文件读写等场景中十分必要。字节串是8位字节的序列,通常用于二进制数据的表示,而字符串则是人类可读的...

    PyPI 官网下载 | bytestring_splitter-1.0.0a4.tar.gz

    总的来说,`bytestring_splitter`是一个针对Python的字节字符串处理库,它在分布式系统和云原生环境中有着广泛的应用前景。通过理解和使用这个库,开发者可以更好地处理二进制数据,提高数据处理效率,同时为构建高...

    Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题

    总之,理解Python 3中的bytes和str类型,以及它们之间的编码和解码机制,是理解和解决问题的关键,特别是在处理文本数据和二进制数据的混合场景。通过熟练掌握这些知识,可以有效地避免编码相关的错误,并提高代码的...

    Python Numpy:找到list中的np.nan值方法

    本篇文章将详细介绍如何在Python Numpy中查找并处理列表中`np.nan`值的方法。 首先,让我们理解`np.nan`的含义。在Numpy中,`np.nan`是一个特殊的浮点数,表示非数字值,通常用于表示数据中的缺失或未定义值。由于`...

    A.Byte.of.Python

    通过阅读《A Byte of Python》的2.x和3.0两个版本,你不仅可以全面理解Python的基础知识,还能了解到版本之间的差异,这对于跨版本的代码迁移和维护至关重要。无论你是打算入门编程,还是想进一步提升Python技能,这...

    python实现unicode转中文及转换默认编码的方法

    在处理 Unicode 编码时,正确理解和使用 Python 的编码机制至关重要。虽然更改默认编码可以解决一些编码问题,但同时也需要注意由此可能带来的新问题。对于 Python 2.x 用户而言,建议尽可能使用兼容性更好的编码...

    utf8与string的相互转换

    在计算机科学领域,字符编码是数据处理和存储中不可或缺的一部分,UTF-8和字符串(string)之间的转换是常见的操作。UTF-8是一种广泛使用的Unicode字符编码,它可以表示Unicode字符集中的所有字符,而字符串则通常指的...

    把中文转化为Unicode

    总的来说,理解和掌握Unicode转换对于跨平台、跨语言的软件开发至关重要,尤其是在处理多语言内容时。在实际应用中,我们需要根据具体需求选择合适的编码方式,并正确地进行编码和解码操作,以确保信息的准确无误...

    python3中bytes和string之间的互相转换

    总之,理解和熟练掌握`str`和`bytes`之间的转换是Python 3编程中至关重要的,尤其是在处理文本数据和二进制数据交互的场景下。正确地使用编码和解码能确保数据的准确性和程序的健壮性。在实际开发中,要时刻注意数据...

    字符串转16进制字节

    在Java中,可以使用`String.getBytes()`和`new String(byte[], charset)`;在JavaScript中,可以使用`Buffer`对象的`toString('hex')`和`from`方法;在C++中,可以利用`std::stringstream`和`std::hex`配合进行转换...

    Python 3.0与2.0的用法区别.pdf

    - 引入了`bytes`类型,对应Python 2.x中的八位串(byte string)。创建`bytes`对象的方式包括`b'hello'`或`bytes('hello', 'utf-8')`。 5. 数据类型: - Python 3.0中移除了`long`类型,所有整数都使用`int`类型...

    Unicode转码

    总之,Unicode转码是IT领域中处理文本数据不可或缺的一部分,理解和掌握相关知识对于开发跨语言、跨平台的应用至关重要。通过合理使用工具和函数,我们可以有效地处理各种编码问题,确保数据的正确性和一致性。

    python常见面试题1

    在面试中,理解Python的基础知识和特性至关重要。以下是一些关键知识点的详细说明: 1. **深拷贝与浅拷贝**: 深拷贝(deep copy)创建了一个新的对象,其内容是原始对象的副本,修改副本不会影响原始对象。可以...

    经典python面试题

    - Python2中`int`和`long`类型分别对应固定大小和任意大小的整数。 - Python3中合并为统一的`int`类型,支持任意大小的整数。 #### 19. xrange与range的区别 - `range`返回列表,占用更多内存。 - `xrange`返回...

    新编码转换大全模块+应用例程.rar

    综上所述,"新编码转换大全模块+应用例程"提供的资源对于理解编码转换的重要性,学习如何在实际项目中处理不同编码的转换,以及提升程序的兼容性和国际化能力都极具价值。通过研究这个模块和应用例程,开发者可以...

    python3编码问题汇总

    UTF-8编码使用1~4个字节表示一个字符,其中ASCII范围内的字符仍使用一个字节表示,而其他字符则根据其在Unicode中的位置使用2~4个字节表示。 例如,“中”字在Unicode中的表示是`01001110 00101101`,而在UTF-8中则...

    中文字符串截取(支持各种编码格式)底层实现源码

    Python中,可以使用切片操作符`[start:end]`实现,例如:`unicode_str[start:end]`。 4. **编码回原格式**:如果需要,将截取后的Unicode字符串重新编码回原始格式,使用`str.encode()`函数,例如:`trimmed_...

    快速检索指定文件源码

    在Java中,可以通过new String(byte[], charset)来创建字符串。 此外,现代IDE(集成开发环境)如Visual Studio、Eclipse、IntelliJ IDEA等提供了强大的源码搜索功能,支持正则表达式,能够快速在大量代码中定位...

    PyPI 官网下载 | twitter.common.string-0.3.11.tar.gz

    在Python的世界里,PyPI(Python Package Index)是官方的软件仓库,它为开发者提供了海量的第三方库,方便用户下载和安装。...通过理解和熟练运用这个库,可以提升Python项目中字符串处理的效率和代码质量。

Global site tag (gtag.js) - Google Analytics