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

4 投票
1 回答
2484 浏览
提问于 2025-04-16 03:51

我想把中文字符发送给一个在线翻译服务,然后把翻译后的英文字符串返回给我。我使用简单的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形式传入,但这个格式不被函数接受。

那么,我该如何将一种格式转换成另一种格式呢?

我看过Stack Overflow上的一个问题在Python中将Unicode转换为字符串(包含额外符号)

但这不是我想要的。urllib接受字符串对象,但不接受Unicode对象,尽管它们包含相同的信息。

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

1 个回答

8

当你得到一个 unicode 对象,并想把它转换成 UTF-8 编码的字节串时,可以使用 theobject.encode('utf8')

听起来有点奇怪,你可能不知道传入的对象是 str 还是 unicode——难道你不也能控制这个函数被调用的地方吗?不过如果真是这样,不管出于什么奇怪的原因,你可能需要像下面这样做:

def ensureutf8(s):
    if isinstance(s, unicode):
        s = s.encode('utf8')
    return s

这个方法只在特定情况下进行编码,也就是说,只有当它接收到一个 unicode 对象时才会编码,如果接收到的对象已经是字节串,就不会再编码了。无论如何,它都会返回一个字节串。

顺便提一下,你的困惑部分来自于你不知道在解释器提示符下输入一个表达式会显示它的 repr,这和用 print 显示的效果是不一样的;-)

撰写回答