我有这个字符串已经使用电子邮件模块从Quoted-printable解码为ISO-8859-1.这给了我像"\ xC4pple"这样的字符串,它们对应于"Äpple"(Apple中的瑞典语).但是,我无法将这些字符串转换为UTF-8.
>>> apple = "\xC4pple"
>>> apple
'\xc4pple'
>>> apple.encode("UTF-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我使用一个简单的python脚本来获取我的CID的预订结果
simple.py
:
data = {"minorRev":"current minorRev #","cid":"xxx","apiKey":"xxx","customerIpAddress":" ","creationDateStart":"03/31/2013","}
url = 'http://someservice/services/rs/'
req = requests.get(url,params=data)
print req
print req.text
print req.status_code
Run Code Online (Sandbox Code Playgroud)
现在在命令提示符下,如果我这样做python simple.py
运行完美并打印req.text
变量
但是,当我尝试做的时候
simple.py
我明白了
python simple.py
我在SO上阅读这篇评分很高的帖子unicodes
这是给出的一个插图:
$ python
>>> import sys
>>> print sys.stdout.encoding
UTF-8
>>> print '\xe9' # (1)
é
>>> print u'\xe9' # (2)
é
>>> print u'\xe9'.encode('latin-1') # (3)
é
>>>
Run Code Online (Sandbox Code Playgroud)
并且解释如下
(1)python按原样输出二进制字符串,终端接收它并尝试将其值与latin-1字符映射匹配.在latin-1中,0xe9或233产生字符"é",这就是终端显示的内容.
我的问题是:为什么终端匹配拉丁-1字符映射时encoding
是'UTF-8'
?
当我试过的时候
>>> print '\xe9'
?
>>> print u'\xe9'
é
Run Code Online (Sandbox Code Playgroud)
我得到的第一个结果与上面描述的结果不同.为什么会出现这种差异latin-1
?在这张照片中会发生什么?
我仍然不完全理解python的unicode和str类型是如何工作的.注意:我在Python 2中工作,据我所知,Python 3对同一问题有完全不同的方法.
我所知道的:
str
是一种较老的野兽,可以保存由历史迫使我们使用的太多编码之一编码的字符串.
unicode
是一种更标准化的方式来表示字符串使用一个巨大的表格,包括所有可能的字符,表情符号,狗屎的小图片等等.
该decode
函数将字符串转换为unicode,反之亦然encode
.
如果我,在python的shell中,只需说:
>>> my_string = "some string"
Run Code Online (Sandbox Code Playgroud)
然后my_string
是一个str
编码的变量ascii
(并且,因为ascii是utf-8的子集,它也被编码utf-8
).
因此,例如,我可以unicode
通过说出其中一行来将其转换为变量:
>>> my_string.decode('ascii')
u'some string'
>>> my_string.decode('utf-8')
u'some string'
Run Code Online (Sandbox Code Playgroud)
我不知道的是:
Python如何处理在shell中传递的非ascii字符串,并且知道这一点,保存单词的正确方法是"kožuš?ek"
什么?
例如,我可以说
>>> s1 = 'kožuš?ek'
Run Code Online (Sandbox Code Playgroud)
在这种情况下s1
成为str
我无法转换为的实例unicode
:
>>> s1='kožuš?ek'
>>> s1
'ko\x9eu\x9a\xe8ek'
>>> print s1
kožuš?ek
>>> s1.decode('ascii')
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
s1.decode('ascii') …
Run Code Online (Sandbox Code Playgroud) Python 何时、何地以及如何将编码隐式应用于字符串或进行隐式转码(转换)?
那些“默认”(即隐含)编码是什么?
例如,什么是编码:
字符串文字?
s = "Byte string with national characters"
us = u"Unicode string with national characters"
Run Code Online (Sandbox Code Playgroud)
类型转换为 Unicode 或从 Unicode 转换时的字节字符串?
data = unicode(random_byte_string)
Run Code Online (Sandbox Code Playgroud)
何时将字节和 Unicode 字符串写入文件或终端?
print(open("The full text of War and Peace.txt").read())
Run Code Online (Sandbox Code Playgroud)
python character-encoding python-2.x python-3.x python-unicode
python ×4
python-2.x ×2
unicode ×2
utf-8 ×2
encoding ×1
grep ×1
latin1 ×1
python-3.x ×1
string ×1