python字符串编码

  •     中文输出
>>> import io
>>> import sys
>>> if int(sys.version[0])==2:
...     f = open(txt_path, 'r')
... else:
...     f = open(txt_path, 'r', encoding='utf-8')
... 
>>> infos = f.readlines()
>>> f.close()
>>> print (infos[0])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)
>>> sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
>>> print (infos[0])
1	大众	2	一汽	3	宝来
  • 首先由内置函数len()计算字符串长度来引出本文的内容。
>>> import chardet
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> s1='66'
>>> s2='中国'
>>> s3='中国66'
>>> len(s1), len(s2), len(s3)
(2, 6, 8)
>>> chardet.detect(s1), chardet.detect(s2), chardet.detect(s3)
({'confidence': 1.0, 'encoding': 'ascii'}, {'confidence': 0.7525, 'encoding': 'utf-8'}, {'confidence': 0.7525, 'encoding': 'utf-8'})

    变量s2和变量s3的长度不是想得到的返回值,这是由于编码问题引起的。之前总结过一篇关于文件的编码文章,本文是对上篇文章的进一步探讨。

    查看字符串变量的字节值(十六进制数,堡垒机终端的输出内容为十六进制数,jupyter输出为字符串变量的原始值)如下:

>>> s1
'66'
>>> s2
'\xe4\xb8\xad\xe5\x9b\xbd'
>>> s3
'\xe4\xb8\xad\xe5\x9b\xbd66'

   将字节值变为unicode,重新计算各自的长度。

>>> s1_u = s1.decode('utf-8')
>>> s2_u = s2.decode('utf-8')
>>> s3_u = s3.decode('utf-8')
>>> isinstance(s1_u, unicode)
True
>>> isinstance(s2_u, unicode)
True
>>> isinstance(s3_u, unicode)
True
>>> len(s1), len(s2), len(s3)
(2, 6, 7)
>>> len(s1_u), len(s2_u), len(s3_u)
(2, 2, 3)

    此时输出为期望得到的字符串变量长度。

    本文提取的内容包括:

  1. unicode把所有语言统一到一套编码格式,不同格式的语言均可与之相互转换;
  2. ASCII编码为美国信息交换标准代码,最初用于表示英文大小写字母,数字及一些特殊符号,最多表示256种字符。对其他语言的支持较差;
  3. len()函数计算参数对象的的长度,不同的编码格式返回不同结果,字典,元组,列表的变量直接求长度,字符串变量需要转换为unicode;
  4. UTF-8编码为针对Unicode的可变长度字符编码,常用的英文为1个字节,汉字常为3个字节,只有生僻的字符才会被编码为4-6个字节。该格式输出内容比较直观,文件及变量常采用utf-8进行处理

 

参考文献:

  1. https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000
  2. 解决Python3下打印utf-8字符串出现UnicodeEncodeError的问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值