前几天给大家介绍了unicode编码和utf-8编码的理论知识,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系。下面在Python2环境中进行代码演示,分别Windows和Linux操作系统下进行演示,以加深对字符串编码的理解。

1、首先在Windows操作系统下的Python2环境中进行演示,我们都知道Python2中的编码问题经常出现,需要通过编码(encode)和解码(decode)进行实现。通过cmd进入命令行窗口,然后输入两个字符串’abc’和u’abc’,如下图所示。需要注意的是这两个字符串的编码格式是不一样的,前者是string,后者是unicode。接下来对其进行编码,指定编码为utf-8,可以发现两个都正常显示,没有报错。

当字符串变为中文的时候,尔后对其再次进行编码演示的时候,如下图所示,可以看到前者有报错产生,而后者没有报错。这个报错在Python2中经常出现,所以需要特别注意,Python字符串在内存中它是通过unicode来进行编码的。此时定义的str1它传递过来的是utf-8编码,非unicode编码,使用encode()函数的前提是待转换的字符串编码为unicode编码。所以可以看到str1会报错,而str2并没有报错。在Windows下字符串的编码格式是GB2312编码,在Linux下字符串的编码格式是utf-8编码。如果想要将str1顺利的转换为utf-8编码的话,则需要先将str1进行解码成unicode编码,再进行编码即可,此时得到的结果同str2转换的结果是一致的。

2、现在在Linux操作系统下的Python2环境中进行演示,使用一样的字符串,结果最后是一样的,但是过程有些不同,如下图所示。

在Windows下字符串的编码格式是GB2312编码,在Linux下字符串的编码格式是utf-8编码。所以当输入有中文的字符串的时候,直接编码为utf-8会报错;通过gb2312编码进行解码也会报错。只要通过utf-8编码进行解码,然后再通过utf-8进行编码才可以正确的输出结果。
有个地方大家可能会觉得很奇怪,就是一开始str1.encode(‘utf-8’),表面上看上去str1已经是unicode编码了,之后进行编码,按说没有什么问题,可是为什么还是会报错呢?其实主要原因还是在于str1并不是真正的解码成了unicode格式。其实str1.encode(‘utf-8’),它默认的会进行一步解码,但是其decode()的过程调用的是默认的编码格式,而这个默认的编码格式却是ASCII编码,如下图所示。

当中文字符串使用ASCII编码进行解码之后,本身就报错了,后边的encode(‘utf-8’)根本就没有执行到。
关于Python2中字符串编码的问题,就先介绍到这里了,相信大家应该有了一个初步的认识了,下一篇文章将介绍Python3中字符串编码的问题。

一篇文章助你理解Python2中字符串编码问题的更多相关文章

  1. 一篇文章助你理解Python3中字符串编码问题

    前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解 ...

  2. 快速理解python2中的编码问题

    # -*- coding:utf-8 -*- ''' python2 中的字符编码有str和unicode(字符串类型的名字) str类型字符串类型在内存中存储的是bytes数据 Unicode类型字 ...

  3. python中字符串编码方式小结

    Python2中字符串的类型有两种:str和unicode,其中unicode是统一编码方式,它使得字符跟二进制是一一对应的,因此所有其他编码的encode都从unicode开始,而其他编码方式按照相 ...

  4. 在python2中的编码

    在python2中的编码 #_author:star#date:2019/10/29'''字符编码:ASCII:只能存英文和拉丁字符,gb2312:只能6700中文,1980年gbk1.0:存了200 ...

  5. python中字符串编码转换

    字符串编码转换程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的. 其实编码问题很好搞定,只要记住一点: 任何平台的任何编码,都能和Unicode互相转换. UTF-8与GBK互相转换,那就先把U ...

  6. 深入浅出地,彻彻底底地理解python中的编码

    python处理文本的功能非常强大,但是如果是初学者,没有搞清楚python中的编码机制,也经常会遇到乱码或者decode error.本文的目的是简明扼要地说明python的编码机制,并给出一些建议 ...

  7. java中字符串编码转换

    Java 正确的做字符串编码转换 字符串的内部表示? 字符串在java中统一用unicode表示( 即utf-16 LE) , 对于 String s = "你好哦!"; 如果源码 ...

  8. 【转载】Perl中字符串编码的处理

    在 Perl看来, 字符串只有两种形式. 一种是octets, 即8位序列, 也就是我们通常说的字节数组. 另一种utf8编码的字符串, perl管它叫string. 也就是说: Perl只熟悉两种编 ...

  9. 三分钟理解Java中字符串(String)的存储和赋值原理

    可能很多Java的初学者对String的存储和赋值有迷惑,以下是一个很简单的测试用例,你只需要花几分钟时间便可理解. 1.在看例子之前,确保你理解以下几个术语: 栈:由JVM分配区域,用于保存线程执行 ...

随机推荐

  1. bzoj2464: 中山市选[2009]小明的游戏(最短路)

    2464: 中山市选[2009]小明的游戏 题目:传送门 题解: 最短路的裸题... 代码: #include<cstdio> #include<cstring> #inclu ...

  2. zzulioj--1799--wrz的压岁钱(贪心)

     1799: wrz的压岁钱 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 407  Solved: 71 SubmitStatusWeb Boa ...

  3. [JZOJ5166] [NOIP2017模拟6.26卢学魔] 解题报告 (记忆化搜索|拓扑排序)

    题目链接: http://172.16.0.132/senior/#main/show/5166 题目: 题解: 这个没什么好讲的,就是注意生产者没人吃也不是食物链,这告诉我们要积累生物知识注意细节 ...

  4. linux文件上传下载

    上传本地文件到服务器:scp 文件名 账号@服务器IP:文件路径eg:scp test.txt root@192.168.0.123:/tmp/服务器文件下载到本地:scp 账号@服务器IP:文件 本 ...

  5. Resolving Problems installing the Java JCE Unlimited Strength Jurisdiction Policy Files package--转

    原文地址:https://www.ca.com/us/services-support/ca-support/ca-support-online/knowledge-base-articles.tec ...

  6. Java Servlet 3.0 新特性

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

  7. 浏览器输入一个url的过程,以及加载完html文件和js文件的标志

    简单理解: 当在浏览器地址栏输入一url时,浏览器会做以下几个步骤: 1.将url转化为ip地址,也就是DNS解析,(先找本地host文件中是否有对应的ip地址,如果有就直接用,没有的话,就按域名的二 ...

  8. POJ 2367 Genealogical tree【拓扑排序】

    题意:大概意思是--有一个家族聚集在一起,现在由家族里面的人讲话,辈分高的人先讲话.现在给出n,然后再给出n行数 第i行输入的数表示的意思是第i行的子孙是哪些数,然后这些数排在i的后面. 比如样例 5 ...

  9. JDOJ 2785: 商之和 数论分块

    Code: #include <iostream> #include <cstdio> #define setIO(s) freopen(s".in",&q ...

  10. BZOJ 4033[HAOI2015] 树上染色(树形DP)

    4033: [HAOI2015]树上染色 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 3188  Solved: 1366[Submit][Stat ...