使用unicode字符串而不是常规字符串? (Python 2.7)

时间:2016-07-01 00:55:33

标签: python string unicode character-encoding

据我所知,Python中的字符串和unicode字符串之间存在差异。但是,每当创建一个字符串对象时,是否可以指示Python使用unicode字符串而不是常规字符串?

因此,当我收到文字输入时,我不需要使用unicode()

我可能听起来很懒,但我只是感兴趣,如果这是可能的......

P.S。我不太了解字符编码,所以如果我有什么不对的地方请纠正我

3 个答案:

答案 0 :(得分:2)

例如(在GUI Shell中的pyhon interactive,diff中):

>>> s = '你好'
>>> s
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> us = u'你好'
>>> us
u'\u4f60\u597d'
>>> print type(s)
<type 'str'>
>>> print type(us)
<type 'unicode'>
>>> len(s)
6
>>> len(us)
2

简而言之:
首先,字符串对象是一系列字符,Unicode字符串是一系列代码点(Unicode代码单元),它们是从0到0x10ffff的数字。 它们,len(字符串)将返回一组字节,len(unicode)将返回一些字符。这个序列需要在内存中表示为一组字节(意思是0-255的值)。将Unicode字符串转换为字节序列的规则称为编码   我认为你应该使用raw_input代替输入,如果你想获得bytestring。

答案 1 :(得分:1)

在Python 2.6+中,您可以使用from __future__ import unicode_literals,但这只会使字符串文字成为Unicode。返回字节字符串的所有函数仍返回字节字符串。

示例:

>>> s = 'abc'
>>> type(s)
<type 'str'>
>>> from __future__ import unicode_literals
>>> s = 'abc'
>>> type(s)
<type 'unicode'>

对于您想要的行为,请使用Python 3。

答案 2 :(得分:0)

  

但是,每当创建一个字符串对象时,是否可以指示Python使用unicode字符串而不是常规字符串?

Python中有两种类型的字符串(在Python 2和3上):字节字符串(字节序列)和Unicode字符串(Unicode代码点序列)。

bytestring = b'abc'
unicode_text = u'abc'

使用'abc'字符串文字创建的字符串类型取决于Python版本和from __future__ import unicode_literals导入的存在。如果没有Python 2上的导入,'abc' literal会创建一个bytestring,否则会创建一个Unicode字符串。

如果在字符串文字中使用非ascii字符,请在Python源文件的顶部添加编码声明,例如:# -*- coding: utf-8 -*-

  

所以当我输入文本时,我不需要使用unicode()?

如果通过“文本输入”表示你的程序以某种方式(从文件,网络,从命令行)接收字节,那么不:你不应该依赖Python来隐式地将字节转换为Unicode - 你应该只要您使用unicode_text = bytestring.decode(character_encoding)收到字节,就会明确地执行此操作。

反之,将文本保留为程序中的Unicode。在必要时尽可能晚地将Unicode字符串转换为字节(例如,通过网络发送文本)。

使用bytestrings处理二进制数据:图像,压缩内容等。使用Unicode字符串处理Python中的文本。

要从文件use io.open()读取Unicode(如果不是locale.getpreferredencoding(False),则必须知道正确的字符编码)。

通过网络接收Unicode文本时要使用的字符编码可能取决于相应的协议,例如the charset can be specified in Content-Type http header

    text = data.decode(response.headers.getparam('charset'))

您可以使用universal_newlines=Trueio.TextIOWrapper()从使用subprocess模块启动的外部进程获取Unicode文本。要弄清楚在Windows上应该使用什么字符编码可能并非易事(如果你阅读俄语,请参阅这里的血腥细节:Byte при печати вывода внешней команды)。