python列表中中文编码的问题

python列表中中文编码的问题

  在python2列表中,有时候,想打印一个列表,会出现如下显示:

<span>python列表中中文编码的问题</span>

这个是由于:

print一个对象,是输出其“为了给人(最终用户)阅读”而设计的输出形式,那么字符串中的转义字符需要转出来,而且 也不要带标识字符串边界的引号。

因此,单独打印列表中的某一项,譬如:list[0],他可以很好的转义出中文字符。而一个list对象,本身就是个数据结构,如果要把它显示给最终用户看,它不会对里面的数据进行润色。

 

解决办法参考:https://www.zhihu.com/question/20413029

 

由此进一步思考:

1、我们在定义字符串的时候,u”中文”的u是什么意思?

string = u"中文"
string.decode('utf8')

  可以看到会出异常:

---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-41-b3abdaf47d60> in <module>()
      1 string = u"中文"
----> 2 string.decode('utf8')

C:\ProgramData\Anaconda2\lib\encodings\utf_8.pyc in decode(input, errors)
     14 
     15 def decode(input, errors='strict'):
---> 16     return codecs.utf_8_decode(input, errors, True)
     17 
     18 class IncrementalEncoder(codecs.IncrementalEncoder):

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

  这说明,string的编码方式并不是utf-8。

我之前一直以为是指的是utf-8的编码方式,其实不然。

 

2、# -*- coding: utf-8 -*-  和  sys.setdefaultencoding(“utf-8”)的区别是什么?

# -*- coding: utf-8 -*- :作用于源代码,如果没有定义,源码不能包含中文字符。https://www.python.org/dev/peps/pep-0263/

sys.setdefaultencoding(“utf-8”) :设置默认的string编码方式

 3、decode\encode指定编码解码方式

# -*- coding: utf-8 -*-
import sys 
#Python2.5 初始化后删除了 sys.setdefaultencoding 方法,我们需要重新载入
reload(sys)
sys.setdefaultencoding('utf-8') 

string = "中文"
print repr(string.decode('utf-8'))

  <span>python列表中中文编码的问题</span>

 

 

 4、unicode编码

字符串通常包含str、unicode两种类型,通常str指字符串编码方式。在Python程序内部,通常使用的字符串为unicode编码,这样的字符串字符是一种内存编码格式,如果将这些数据存储到文件或是记录日志的时候,就需要将unicode编码的字符串转换为特定字符集的存储编码格式,比如:UTF-8、GBK等。

unicode编码:编码表的编号从0一直算到了100多万(三个字节)。每一个区间都对应着一种语言的编码。目前几乎收纳了全世界大部分的字符。所有的字符都有唯一的编号,事实上是一种字符集。但是,unicode把大家都归纳进来,却没有为编码的二进制传输和二进制解码做出规定。于是,就出现了如下解决方案:uft-8,utf-16,utf-32这些编码方案,主要还是为了解决一个信息传输效率的问题,因为如果直接根据字符集进行传输的话,三个字节的表示就会比较低效了。

str  转 unicode

string = "asdf"
string.decode("utf-8")

  <span>python列表中中文编码的问题</span>

所以,u就是unicode

unicode转 str

string = u"asdf"
string.encode("utf-8")

  <span>python列表中中文编码的问题</span>

5、unicode-escape

在将unicode存储到文本的过程中,还有一种存储方式,不需要将unicode转换为实际的文本存储字符集,而是将unicode的内存编码值进行存储,读取文件的时候再反向转换回来,是采用:unicode-escape的转换方式。

unicode到unicode-escape

string = "中文"  #  或 u"中文",不影响,因为最终都是unicode的内存编码
string.encode("unicode-escape")

  <span>python列表中中文编码的问题</span>

unicode-escape到unicode

string = "中文"  
string.decode("unicode-escape")

  >> u’\xe4\xb8\xad\xe6\x96\x87

6、string-escape

对于utf-8编码的字符串,在存储的时候,通常是直接存储,而实际上也还有一种存储utf-8编码值的方法,即:string-escape。

str(utf8)到string-escape

string = "中文"  
string.encode("string-escape")

  >> ‘\\xe4\\xb8\\xad\\xe6\\x96\\x87’

 string-escape到str(utf8)

string = "中文"  
string.decode("string-escape")

  >>’\xe4\xb8\xad\xe6\x96\x87′

 

 

//————-由上,进一步分析:

 

a = "中文"
print repr(a.decode("utf-8"))
a = "中文"
print repr(a.decode("unicode-escape"))
print repr(u"中文")
print repr(a)

  <span>python列表中中文编码的问题</span>

可以看到,从str转unicode和从unicode-escape转unicode的差距。再比如:

string = '\u4e2d\u6587'
print repr(string.decode("unicode-escape"))
print repr(string.decode("utf8"))

  <span>python列表中中文编码的问题</span>

更为清楚的看到,从unicode-escape转unicode,两者没有文本转化的过程,是一个内存转化的过程。而通过str转unicode,会有文本转化,譬如对转义字符的操作。

 

对于列表中中文编码的解释:

 

arr = [u"中文"]
print arr
print repr(arr)
pp =  str(arr).decode("unicode-escape")#
print pp
print repr(pp)
tt = str(arr).decode("utf-8")
print tt
print repr(tt)

  

  >>[u’\u4e2d\u6587′]

       >>[u’\u4e2d\u6587′]

       >>[u’中文’]

       >>u”[u’\u4e2d\u6587′]”

       >>[u’\u4e2d\u6587′]

       >>u”[u’\\u4e2d\\u6587′]”

 

由此可见,想要打印list中的中文,思路是:

通过字符串化处理,将list转化为str(utf-8)文本编码的方式,同时要保留list里面的unicode,避免通过字符处理导致的转义操作,破坏掉中文的unicode,因此选择了unicode-escape

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119476.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 慧荣SM2246XT主控的固态硬盘修复开卡不识别怎么短接方法

    慧荣SM2246XT主控的固态硬盘修复开卡不识别怎么短接方法一块坏了的240G的固态硬盘,电脑完全不认盘了,所以想修复一下,拆开看到主控是慧荣的SM2246XT,幸好此主控是有开卡软件的,下载也比较方便,最新的SM2246XT_MP_EnhancePageMode_MPQ1102A_DBQ0412_FWR1212A.rar修复成功率很高,但跟U盘量产不同,固态硬盘开卡是需要短接的,但很多人不知道SM2246XT的固态硬盘该怎么短接,这里就教大家。如图拆开ssd外壳后可以看到板子上有ROMMODE的字样,那里就是短接的位置了,这里的4个短接点,我们是需要用镊子两两短

    2022年6月14日
    188
  • java ORA-01008: 并非所有变量都已绑定避坑

    java ORA-01008: 并非所有变量都已绑定避坑//数据库增加数据的函数 publicbooleanadd(Creditc){ Stringsql=”insertintocredit(id,name,pwd,Money)” +”values(?,?,?,?)”; //要插入的对象中的数据拿到object数组中 Objecto[]={c.getId(),c.getName(),c.getPwd()…

    2025年9月25日
    3
  • 达梦数据库查询语句「建议收藏」

    达梦数据库查询语句「建议收藏」DMSQL简介DM_SQL语言是一种介于关系代数与关系演算之间的语言,其功能主要包括数据定义、查询、操纵和控制四个方面,通过各种不同的SQL语句来实现。按照所实现的功能,DM_SQL语句分为以下几种:用户、模式、基表、视图、索引、序列、全文索引、存储过程和触发器的定义和删除语句,基表、视图、全文索引的修改语句,对象的更名语句;查询(含全文检索)、插入、删除、修改语句;数据库安全语句…

    2025年10月7日
    1
  • 简单详细的SpringBoot自动配置原理解析

    简单详细的SpringBoot自动配置原理解析SpringBoot启动会根据条件加载配置

    2022年6月16日
    28
  • ORM的详解

    ORM的详解

    2021年11月7日
    59
  • 二叉树层序遍历(C语言)[通俗易懂]

    二叉树层序遍历(C语言)[通俗易懂]二叉树的层序遍历即从上到下,在每一层从左到右依次打印数据。如下:层序遍历结果:ABCDEFG基本思路即将根节点入队后,之后每次都将队首元素出队,打印队首元素数据,并将队首元素左右子树入队,一直重复上述过程。自然,本题还可以用数组来实现。代码:#include<stdio.h>#include<stdlib.h>#defineQueueMax100typedefstructNode{chardata;structNode*

    2022年5月22日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号