据我所知,Python中的字符串和unicode字符串之间存在差异。但是,每当创建一个字符串对象时,是否可以指示Python使用unicode字符串而不是常规字符串?
因此,当我收到文字输入时,我不需要使用unicode()
?
我可能听起来很懒,但我只是感兴趣,如果这是可能的......
P.S。我不太了解字符编码,所以如果我有什么不对的地方请纠正我
答案 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=True
或io.TextIOWrapper()
从使用subprocess
模块启动的外部进程获取Unicode文本。要弄清楚在Windows上应该使用什么字符编码可能并非易事(如果你阅读俄语,请参阅这里的血腥细节:Byte при печати вывода внешней команды)。