我想发送中文字符,由一个在线服务,并有结果的英文字串返回。为此,我使用了简单的JSON和urllib。
是的,我宣布。
# -*- coding: utf-8 -*-
在我的密码上面。
现在,如果我给urllib一个字符串类型的对象,即使该对象包含什么是Unicode信息,一切都可以正常工作。我的函数叫做translate
。
例如:
stringtest1 = '無與倫比的美麗'
print translate(stringtest1)
结果是正确的翻译和操作
type(stringtest1)
确认这是一个字符串对象。
但如果你这么做
stringtest1 = u'無與倫比的美麗'
然后尝试使用我的翻译函数,我得到了这个错误:
File "C:\Python27\lib\urllib.py", line 1275, in urlencode
v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-8: ordinal not in range(128)
经过一番研究,这似乎是一个常见的问题:
现在,如果我输入一个脚本
stringtest1 = '無與倫比的美麗'
stringtest2 = u'無與倫比的美麗'
print 'stringtest1',stringtest1
print 'stringtest2',stringtest2
它的执行返回:
stringtest1 無與倫比的美麗
stringtest2 無與倫比的美麗
但只需在控制台中键入变量:
>>> stringtest1
'\xe7\x84\xa1\xe8\x88\x87\xe5\x80\xab\xe6\xaf\x94\xe7\x9a\x84\xe7\xbe\x8e\xe9\xba\x97'
>>> stringtest2
u'\u7121\u8207\u502b\u6bd4\u7684\u7f8e\u9e97'
弄到我了。
我的问题是,我无法控制要翻译的信息是如何达到我的功能的。看来我必须以Unicode的形式把它带来,这是函数所不接受的。
那么,我如何将一件事转换成另一件呢?
我读过堆栈溢出问题https://stackoverflow.com/questions/1207457。
但这不是我想要的。Urllib接受字符串对象,但不接受Unicode对象,这两个对象都包含相同的信息。
嗯,至少在web应用程序中,我发送的信息没有变化,我不确定它们在Python中是否仍然是等价的东西。
发布于 2010-09-08 15:52:45
当您获得一个unicode
对象并希望从它返回一个UTF-8编码字节字符串时,请使用theobject.encode('utf8')
。
奇怪的是,您不知道传入的对象是str
还是unicode
--当然您也控制了该函数的调用站点?!但如果情况确实如此,不管出于什么奇怪的原因,你可能需要这样的东西:
def ensureutf8(s):
if isinstance(s, unicode):
s = s.encode('utf8')
return s
它仅有条件地编码,也就是说,如果它接收到unicode对象,而不是它接收到的对象已经是字节字符串。在这两种情况下,它都返回一个字节字符串。
顺便说一句,您的部分困惑似乎是因为您不知道在解释器提示符下输入一个表达式就会显示它的repr
,这与您在print
中得到的效果不同;-)。
https://stackoverflow.com/questions/3669436
复制相似问题