当前位置: 首页 > news >正文

Python Cookbook-1.21 在Unicode和普通字符串之间转换

任务

需要处理一些可能不符合ASCII字符集的文本数据。

解决方案

普通字符串可以用多种方式编码成Unicode字符串,具体要看你究竟选择了哪种编码:

unicodestring = u"Hello world"
# 将Unicode转化为普通Python字符串:"encode"
utf8string = unicodestring.encode("utf-8")
asciistring = unicodestring.encode("ascii")
isostring = unicodestring.encode("ISO-8859-1")
utf16string = unicodestring.encode("utf-16")
# 将普通Python字符串转化为Unicode:"decode"
plainstring1 = unicode(utf8string, "utf-8")
plainstring2 = unicode(asciistring, "ascii")
plainstring3 = unicode(isostring, "ISO-8859-1")
plainstring4 = unicode(utf16string, "utf-16")
assert plainstring1 == plainstring2 == plainstring3 == plainstring4

讨论

如果想处理含有非ASCII字符的文本数据,首先要懂一些Unicode—什么是unicode、unicode怎么工作、Python如何处理unicode。前一节提供了少量却很重要的指导,本节将在这个话题下继续深入讨论。
不用在完全了解Unicode的一切之后,才去处理现实世界中的有关unicode的问题,但是一些基本知识却是不可或缺的。首先,需要理解字节和字符之间的区别。在过去的以ASCII字符为主体的语言以及环境中,字节和字符被认为是同一种东西。一个字节可以有256个不同的值,因此环境被限制为只能处理不超过256个不同的字符。而另一方面,Unicode则支持成千上万的字符,那也意味着每个unicode字符占用超过1个字节的宽度。因此,首先需要搞清楚字符和字节之间的区别。
标准的Python字符串实际上是字节串,这种字符串中的每个字符,长度为1,实际上就是一个字节。我们还可以用Python的标准字符串类型的其他一些术语来称其为8位字符串或者普通字符串。在本节中,我们称这种类型的字符串为字节串,以此来提醒你它们的单字节的特点。
Python的Unicode字符是一个抽象的对象,它足够大,能够容纳任何字符,可以同Python的长整数进行类比。完全无须担心它的内部表示;只有当你试图将它们传递给一些基于字节处理的函数时—比如文件的write方法和网络socket的send方法,unicode字符的表示才会成为一个问题。基于这个原因,必须选择以何种方式将这些字符表示成字节。将unicode字符串转化成字节串被称为对该字符串编码。同样的,如果从一个文件、socket或者其他基于字节的对象中载入一个unicode字符串,必须对其解码,将其从字节转成字符。
从unicode对象转化成字节串有很多方法,这些方法都被称为某种编码。由于一系列历史的、政治的、以及技术上的原因,没有哪种编码是“正确”的。每种编码都有个大小写不敏感的名字,这个名字可以被传递给encode和decode函数作为参数。下面给出一些应该知道的编码。

  • UTF-8编码可以应用于任何Unicode字符。它也向后兼容ASCII,所以一个纯粹的ASCII文件也可以被认为是一个UTF-8文件,而只使用ASCII字符的UTF-8文件,也完全等同于使用这些字符的ASCII文件。这个属性使得UTF-8具有极好的向后兼容能力,特别是对一些老的UNIX工具来说。UTF-8是迄今为止UNIX上最具主导性的编码,同时也是XML文档的默认编码。UTF-8的主要弱点是,对于一些东方的语言文本,它的效率比较低。
    UTF-16是微软操作系统和Java环境喜爱的编码。它对于西方语言效率略低,但对于东方语言却更有效率。UTF-16有一个变种,被称为UCS-2。 ISO-8859系列的编码是ASCII的超集,每种编码都能处理256个不同的字符。这些编码不能支持所有的Unicode字符;它们只支持一些特定的语系或语言。ISO-8859-1,也以“Latin-1”的名字为人所知,覆盖了大多西欧和非洲的语言,但不包括阿拉伯语。ISO-8859-2,也被称为“Latin-2”,覆盖了很多东欧的语言,比如匈牙利和波兰。ISO-8859-15,现在在欧洲非常流行,基本上它和ISO-8859-1一样,但增加了对欧洲货币符号的支持。
    如果想对所有的Unicode字符编码,你可能需要用UTF-8。当需要处理别的程序或者输入设备用其他编码创建的数据时,你才可能需要用到其他编码,或者相反,在需要输出数据给你的下游程序或者输出设备,而它们采用的是另一种特定的编码时。第1.22节展示了一个例子,这个例子中,可以看到怎样通过程序的标准输出来驱动其他下游程序或设备。

相关文章:

  • 【Python 语法】Python 正则表达式(regular expressions, regex)
  • 代码随想录 第一章 数组 977.有序数组的平方
  • 【拒绝算法PUA】LeetCode 1287. 有序数组中出现次数超过25%的元素
  • 30填学习自制操作系统第二天
  • 从MySQL迁移到PostgreSQL的完整指南
  • 【Elasticsearch】硬件资源优化
  • 下载安装运行测试开源vision-language-action(VLA)模型OpenVLA
  • Git Pull 报错解决方案:fatal: Need to specify how to reconcile divergent branches
  • PHP是如何并行异步处理HTTP请求的?
  • CSS基础入门——盒模型与布局
  • CES Asia 2025“传播势能放大器”:科技与环保的双重盛宴
  • 【gopher的java学习笔记】什么是classLoader
  • 网络工程师 (43)IP数据报
  • FormCreate设计器v5.6发布—AI智能表单助理正式上线!
  • Linux 外设驱动 应用 6 陀螺仪实验
  • 【算法】链表
  • Unity Shader学习6:多盏平行光+点光源 ( 逐像素 ) 前向渲染 (Built-In)
  • Word中接入大模型教程
  • 深度学习框架探秘|Keras:深度学习的魔法钥匙
  • 最新智能优化算法: 贪婪个体优化算法(Greedy Man Optimization Algorithm,GMOA)求解23个经典函数测试集,MATLAB代码
  • 中国古代文学研究专家、南开大学教授李剑国逝世
  • 广东茂名高州市山体滑坡已致3死1失联,搜救仍在继续
  • 视觉周刊|走进变革中的博物馆
  • 中国旅游日|上天当个“显眼包”!低空经济的“飞”凡魅力
  • 浙江广厦:诚挚道歉,涉事责任人交公安机关
  • 波兰总统选举投票开始,将是对亲欧路线的一次严峻考验