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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • jenkinsfile docker_python安装虚拟环境

    jenkinsfile docker_python安装虚拟环境前言之前我们用docker手动安装了jenkins环境,在jenkins中又安装了python3环境和各种安装包,如果我们想要在其他3台机器上安装,又是重复操作,重复劳动,那会显得很low,这里可以

    2022年7月28日
    3
  • datax实现mysql数据同步

    datax实现mysql数据同步datax同步数据使用详解

    2022年5月17日
    80
  • 网络爬虫——scrapy案例「建议收藏」

    网络爬虫——scrapy案例「建议收藏」1.创建项目打开一个终端输入(建议放到合适的路径下,默认是C盘)scrapystartprojectTXmoviescdTXmoviesscrapygenspidertxmsv.qq.com2.修改setting修改三项内容,第一个是不遵循机器人协议,第二个是下载间隙,由于下面的程序要下载多个页面,所以需要给一个间隙(不给也可以,只是很容易被侦测到),第三个是请求头,添加一个User-Agent,第四个是打开一个管道ROBOTSTXT_OBEY=FalseDOWN

    2022年6月26日
    39
  • 在Anaconda下安装Pytorch的超详细步骤「建议收藏」

    在Anaconda下安装Pytorch的超详细步骤「建议收藏」近几年来,pytorch的发展速度越来越快,在github、CSDN等开源网站上下载的源代码逐渐由tensorflow向pytorch转变。近期在看论文时需要对代码进行复现,在安装pytorch时遇到了很多问题,将整个过程写出来供大家借鉴学习。注:在进行安装的过程中,通过cmd命令框输入命令发现找不到文件,说明环境变量没有配置好。此方法不需要配置环境变量。

    2022年10月7日
    0
  • 华为电脑如何投屏到电视linux,华为mate10/mate10pro怎么投屏至电视或电脑上面?「建议收藏」

    一、使用华为2代DOCK实现手机连接大屏说明手机投屏输出接口为Type-C,支持通过转换器转换成标准的DP、HDMI、MiniDP、VGA、DVI等接口。考虑到设备的兼容性和信号的转换,请优先选择DP、HDMI接口。1.打开大屏显示器;2.将VGA直连线(两端都是VGA接口)的一端连接大屏,另一端连接至华为2代DOCK;3.将华为2代DOCK(扩展坞)的Type-C接口(USB-C接口)连接到华…

    2022年4月6日
    725
  • 前端 — HTML

    前端 — HTML1.HTML结构1.1HTML文件基本结构<html><head><title>第一个html程序</title></head><body>helloworld!</body></html>html标签是整个html文件的根标签(最顶层标签)head标签中写页面的属性.body标签中写的是页面上显示的

    2022年5月5日
    36

发表回复

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

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