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

ful*_*inu 4 python string unicode urllib unicode-string

我想通过在线服务发送中文字符,并返回生成的英文字符串.我正在使用简单的JSON和urllib.

是的,我在宣布.

# -*- coding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)

在我的代码之上.

现在一切正常,如果我给urllib一个字符串类型的对象,即使该对象包含什么是Unicode信息.我的功能被调用translate.

例如:

stringtest1 = '???????'

print translate(stringtest1)
Run Code Online (Sandbox Code Playgroud)

导致正确的翻译和做

type(stringtest1) 
Run Code Online (Sandbox Code Playgroud)

确认这是一个字符串对象.

但如果这样做

stringtest1 = u'???????'
Run Code Online (Sandbox Code Playgroud)

并尝试使用我的翻译功能我收到此错误:

  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)
Run Code Online (Sandbox Code Playgroud)

经过一番研究,似乎这是一个常见的问题:

现在,如果我输入一个脚本

stringtest1 = '???????' 
stringtest2 = u'???????'
print 'stringtest1',stringtest1
print 'stringtest2',stringtest2
Run Code Online (Sandbox Code Playgroud)

执行它返回:

stringtest1 無與倫比的美麗
stringtest2 ???????
Run Code Online (Sandbox Code Playgroud)

但只需在控制台中键入变量:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

抓住我的.

我的问题是我无法控制要翻译的信息如何影响我的功能.而且似乎我必须以Unicode格式提供它,该函数不接受它.

那么,我如何将一件事转换成另一件事呢?

我已经阅读了Stack Overflow问题将Unicode转换为Python中的字符串(包含额外的符号).

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

好吧,至少在Web应用程序的眼中,我发送的是未更改的信息,我不确定它们是否仍然是Python中的等价物.

Ale*_*lli 8

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

你不知道传入的对象是否是- str或者unicode你确实控制了该功能的呼叫站点,这似乎很奇怪?!但如果情况确实如此,无论出于什么奇怪的原因,你可能需要这样的东西:

def ensureutf8(s):
    if isinstance(s, unicode):
        s = s.encode('utf8')
    return s
Run Code Online (Sandbox Code Playgroud)

它只是有条件地编码,也就是说,如果它接收到一个unicode对象,而不是它接收的对象已经是一个字节串.它在任何一种情况下都返回一个字节串.

顺便说一句,你的困惑的一部分似乎是由于你不知道只是在翻译提示下输入一个表达式会告诉你它repr,这与你得到的效果不同print;-).