将字符串传递给函数时,特殊字符编码将丢失

时间:2016-03-23 12:58:49

标签: python python-2.7 encoding utf-8

string = "Magic Cookie® Extra"
print string

会给出输出:

"Magic Cookie® Extra"

但是,如果我将字符串传递给此函数,该函数将其与另一个字符串组合:

def label_print(label, string):
    print label + ": " + string

label_print("Product name", string)

会给出输出:

"Product name: Magic Cookie?? Extra"

为什么会这样,我该如何预防?

与第一个字符串的串联是否重置编码,以使®字符变为??

我已尝试编辑该函数,以便局部变量labellabel.encode("utf-8"),但这并没有帮助。

我的Python文件的顶部也有# -*- coding: utf-8 -*-

2 个答案:

答案 0 :(得分:2)

正如你在评论中所说,字符串是从网页上删除的,这里有可能解释所发生的事情。 UTF8将127以上的字符编码为多字节字符。例如,®字符的代码为0xae,并在utf8中编码为'\xc2\xae'

因此,您的字符串实际上是'Magic Cookie\xc2\xae Extra',当连接时会导致'Product name: Magic Cookie\xc2\xae Extra'

正如@AaronDigulla解释的那样,这两个特殊字符然后翻译为?,给出了结果。

获得它的一致方法是使用encode方法和'replace'错误处理程序:

>>>> print 'Product name: Magic Cookie\xc2\xae Extra'.decode('ascii', 'replace').encode('ascii', replace')
Product name: Magic Cookie?? Extra

但是直到你确切地说出你做了什么以及你想要什么,我才能告诉你如何解决......

答案 1 :(得分:1)

如果我运行你的代码,我会

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 12: ordinal not in range(128)

当我尝试拨打string.encode('UTF-8')时,这里还有其他工作要做。

一般来说,您不能将UTF-8编码的字符串与非编码的字符串混合使用。一切都是编码的或什么也没有。没有混合。

在Python 2中解决这些问题的一种方法是使用unicode字符串:

string = u"Magic Cookie® Extra"
print repr(string)
print repr('a ' + string + ' b')

打印:

u'Magic Cookie\xae Extra'
u'a Magic Cookie\xae Extra b'

正如您所看到的,即使串联中的字符串不是unicode字符串,Pyhton"升级"他们。这将很好用......除非你在某处有UTF-8编码的字节串......

注意:?表示有人为sys.stdout安装了一个输出转换器,可将未知/不可打印的字符转换为?。搜索sys.stdout的所有来源,找出发生这种情况的原因。