一直以来我其实一直对python的编码弄得非常晕,能正常编码,也能处理一些情况。但是始终不明白有些问题究竟为何出,原因是什么,为什么要这样用。

今天晚上正好好好研究了一番解答了自己心中的困惑。

Q:python2.7.x里面的中文表示到底是什么鬼?

A:直接来看看

In [23]: x = '好不好喝都要喝'

In [24]: x
Out[24]: '\xe5\xa5\xbd\xe4\xb8\x8d\xe5\xa5\xbd\xe5\x96\x9d\xe9\x83\xbd\xe8\xa6\x81\xe5\x96\x9d'

这个x打印值相信熟悉编码的盆友都知道,这是utf-8编码。也就是说python2.7.x 在默认情况下将中文默认转到了utf-8编码。

这里type(x)得到结果是str

Q:python2.7.x里的unicode究竟什么鬼?

A:还是通过例子来看看

In [16]: x = u'好不好喝就很好喝'

In [17]: type(x)
Out[17]: unicode

在2.7.x在中,u写在字符串前面将会将一个字符串转成unicode对象。

Q:python2.7.x中unicode可以和str相加吗?

A:还是来看例子

In [62]: z = '好不好喝'

In [63]: x = u'好不好喝都要喝'

In [64]: z+x
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-64-f964ff206363> in <module>()
----> 1 z+x UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

熟悉的报错,可见在python2.7.x中,unicode中文和utf8中文是不能相加的因为是不同类型。

Q:那么英文字符串可以相加吗?

A:可以。具体就不掩饰了大家可以自己试试。而且最终得到的结果会被转成全unicode

这两个库在对无论utf8还是unicode对象进行中文编码的时候,都会将内容转成unicode再编码。最后你拿到结果decode之后就变成了unicode对象,想要再拿到utf8对象,就需要再encode一次才可以了。

一不注意就踩坑。

python2.7.x的字符串编码到底什么鬼?(中文和英文的处理)的更多相关文章

  1. php 字符串截取,支持中文和其他编码

    function.php //使用方法 $content= mb_substr($content,0,25,'utf-8'); /** * 字符串截取,支持中文和其他编码 * @static * @a ...

  2. 我的Java开发学习之旅------>工具类:Java使用正则表达式分离出字符串中的中文和英文

    今天看到一个工具类使用正则表达式将一大段字符串中的中文和英文都分离出来了,在此记录一下,读者可以收藏! import java.util.ArrayList; import java.util.Col ...

  3. Python2和Python3的字符串编码和类型

    一.字符串编码和类型 任何编码格式的字符串,都可以和Unicode互相转换. gbk -> utf8 # 将字符串按指定格式进行解码,返回Unicode字符串unicode_str = gbk_ ...

  4. JS判断字符串长度的5个方法(区分中文和英文)

    目的:计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: 代码如下: String.prototype.gblen = function() {    var len = 0;    fo ...

  5. C#获取字符串字符的位数(区分中文和英文长度)

    请看以下代码 1 private static int GetStrLength(string str) 2 { 3 if (string.IsNullOrEmpty(str)) return 0; ...

  6. java是用utf-16be编码方式编的。中文和英文都是两个字节

  7. Python2和Python3中的字符串编码问题解决

    Python2和Python3在字符串编码上是有明显的区别. 在Python2中,字符串无法完全地支持国际字符集和Unicode编码.为了解决这种限制,Python2对Unicode数据使用了单独的字 ...

  8. 基于Python的数据分析(2):字符串编码

    在上一篇文章<基于Python的数据分析(1):配置安装环境>中的第四个步骤中我们在python的启动步骤中强制要求加载sitecustomize.py文件并设置其默认编码为"u ...

  9. Python的字符串编码

    本文用实验详细地演示了Python2和Python3在字符串编码上的区别. 在Python2中,字符串字面量对应于8位的字符或面向字节编码的字节字面量.这些字符串的一个重要限制是它们无法完全地支持国际 ...

随机推荐

  1. 上传文件异常 MultipartException

    参考自  https://blog.csdn.net/u010429286/article/details/54381705 现象 上传文件报错 org.springframework.web.mul ...

  2. 查看和指定SpringBoot内嵌Tomcat的版本

    查看当前使用的Tomcat版本号 Maven Repository中查看 比如我们需要查Spring Boot 2.1.4-RELEASE的内嵌Tomcat版本, 可以打开链接: https://mv ...

  3. 理解HTML5中Range对象

    1.理解Range对象    重新来学习下HTML5中的Range对象和Selection对象,最近在维护富文本编辑器,感觉这方面的知识点很有用,所以趁着周末多学习下~  什么是Range对象? 在H ...

  4. CVE-2018-14424 use-after-free of disposed transient displays 分析报告

    漏洞描述 GDM守护进程不能正确的取消导出在D-Bus 接口上已经被销毁的display对象,这造成本地用户可以触发UAF,从而使系统崩溃或造成任意代码执行. 调试环境 gdm版本: 3.14.2(通 ...

  5. PAT A1103 Integer Factorization (30 分)——dfs,递归

    The K−P factorization of a positive integer N is to write N as the sum of the P-th power of K positi ...

  6. 稳压二极管&TVS二极管

    稳压二极管 稳压二极管利用的特性是:二极管被反向击穿之后,随着电流的变化,稳压二极管两端电压维持不变的特性: 普通二极管反向击穿后就坏了,但是稳压二极管却可以恢复,而且在被击穿后处在正常的工作状态: ...

  7. JAVA体系的线程的实现,线程的调度,状态的转换

    java体系中线程的实现 1.使用内核线程实现 内核线程就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操作调度器对线程进行调度,并负责将线程的任务映射到各个处理器上,每个内核 ...

  8. Python基础语法复习

    1.数据类型 List 列表 函数 append(): 在列表末尾追加. count(): 计算对象在列表中出现的次数. extend():将列表内容添加到列表中. index(): 计算对象在列表中 ...

  9. React-引入图片的方法

    方法一: import imgURL from '../../images/logo.png'; <img src={imgURL} alt="1"/> 方法二: &l ...

  10. [Oracle]获得PDB相关的xml 文件

    问题:客户进行了PDB的克隆之后,发现启动时出现: ORA-44777: Pluggable database service cannot be started. 分析手段: 为了获得PDB的相关信 ...