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"
为什么会这样,我该如何预防?
与第一个字符串的串联是否重置编码,以使®
字符变为??
。
我已尝试编辑该函数,以便局部变量label
为label.encode("utf-8")
,但这并没有帮助。
我的Python文件的顶部也有# -*- coding: utf-8 -*-
。
答案 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
的所有来源,找出发生这种情况的原因。