将包含非ASCII符号的Unicode对象转换为字符串对象(在Python中)

将包含非ASCII符号的Unicode对象转换为字符串对象(在Python中),python,string,unicode,urllib,unicode-string,Python,String,Unicode,Urllib,Unicode String,我想通过在线服务发送要翻译的中文字符,并返回生成的英文字符串。我使用simple和urllib来实现这一点 是的,我宣布 # -*- coding: utf-8 -*- 在我的代码之上 现在,如果我为urllib提供一个字符串类型的对象,即使该对象包含Unicode信息,一切都可以正常工作。我的函数名为translate 例如: stringtest1 = '無與倫比的美麗' print translate(stringtest1) 结果是正确的翻译和操作 type(stringtest1

我想通过在线服务发送要翻译的中文字符,并返回生成的英文字符串。我使用simple和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形式提供它,这是函数不接受的

那么,如何将一种东西转换成另一种呢?

我读过堆栈溢出问题

但这不是我想要的。Urllib接受字符串对象,但不接受Unicode对象,两者都包含相同的信息


好吧,至少在我发送未更改信息的web应用程序看来,我不确定它们在Python中是否仍然是等效的。

当您获得一个
unicode
对象并希望从中返回一个UTF-8编码的字节字符串时,请使用
object.encode('utf8')

奇怪的是,您不知道传入对象是
str
还是
unicode
——当然您也控制了该函数的调用站点?!但如果真是这样,无论出于何种奇怪的原因,你可能需要一些东西,比如:

def ensureutf8(s):
    if isinstance(s, unicode):
        s = s.encode('utf8')
    return s
它只进行有条件的编码,也就是说,如果它接收到一个unicode对象,而不是如果它接收的对象已经是一个字节字符串。无论哪种情况,它都返回一个字节字符串


顺便说一句,您的部分困惑似乎是因为您不知道在解释器提示下输入一个表达式就会显示它的
repr
,这与
print
;-)的效果不同

谢谢大家!!现在情况越来越清楚了。谢谢你给我额外的小费更健壮的转换为unicode的方法示例可以在