为了账号安全,请及时绑定邮箱和手机立即绑定

Python str与unicode类型

Python str与unicode类型

慕雪6442864 2019-12-11 09:09:41
使用Python 2.7,我想知道使用type unicode代替真正的优势是什么str,因为它们似乎都可以容纳Unicode字符串。除了能够unicode使用转义字符在字符串中设置Unicode代码之外,还有什么特殊的原因\吗?:使用以下命令执行模块:# -*- coding: utf-8 -*-a = 'á'ua = u'á'print a, ua结果:á,á编辑:使用Python Shell进行更多测试:>>> a = 'á'>>> a'\xc3\xa1'>>> ua = u'á'>>> uau'\xe1'>>> ua.encode('utf8')'\xc3\xa1'>>> ua.encode('latin1')'\xe1'>>> uau'\xe1'因此,该unicode字符串似乎是使用latin1而不是编码的utf-8,而原始字符串是使用utf-8?编码的。我现在更加困惑!:S
查看完整描述

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

unicode用于处理文本。文本是一个代码点序列,可能大于一个字节。文本可以被编码在一个特定的编码来表示文本作为原始字节(例如utf-8,latin-1...)。


注意,这unicode 是没有编码的!python使用的内部表示形式是实现细节,只要它能够表示所需的代码点,您就不必在意它。


相反,str在Python 2中是字节的简单序列。它不代表文字!


您可以将其unicode视为某些文本的一般表示形式,可以用多种不同方式将其编码为通过表示的二进制数据序列str。


注意:在Python 3中,unicode已重命名为,str并且bytes为普通字节序列提供了一种新类型。


您可以看到一些差异:


>>> len(u'à')  # a single code point

1

>>> len('à')   # by default utf-8 -> takes two bytes

2

>>> len(u'à'.encode('utf-8'))

2

>>> len(u'à'.encode('latin1'))  # in latin1 it takes one byte

1

>>> print u'à'.encode('utf-8')  # terminal encoding is utf-8

à

>>> print u'à'.encode('latin1') # it cannot understand the latin1 byte

请注意,使用时,str您可以对特定编码表示形式的单个字节进行较低级别的控制,而使用时,unicode您只能在代码点级别进行控制。例如,您可以执行以下操作:


>>> 'àèìòù'

'\xc3\xa0\xc3\xa8\xc3\xac\xc3\xb2\xc3\xb9'

>>> print 'àèìòù'.replace('\xa8', '')

à�ìòù

以前是有效的UTF-8,现在已经不复存在了。使用unicode字符串,您不能以结果字符串不是有效的unicode文本的方式进行操作。您可以删除代码点,将代码点替换为其他代码点等,但不能与内部表示混淆。



查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 394 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信