如何在Python中将不可打印字符串转换为正常字符串?
我有一个字符串(最初是从搜索引擎的搜索结果中获取的),里面包含一些特殊字符,比如 '\xe9',我只想把这些字符替换成正常的字符,这样我就可以打印出来(这是一个Python程序)。
那么我该怎么做呢?它一直给我报这个错:
" 文件 "D:\Python27\lib\encodings\cp1255.py",第12行,在编码中返回 codecs.charmap_encode(input,errors,encoding_table) UnicodeEncodeError: 'charmap' 编解码器无法在位置11编码字符 u'\xe9':字符映射到未定义的内容"
顺便说一下,当我打印 "sys.getdefaultencoding()" 时,它显示的是:Cp1255
这个错误最初发生在这个函数调用中:"urllib.urlencode(这个字符串)",但当我尝试写 "print (firstSearch['Results'][i]['Title'])" 时也会出现这个错误,其中 firstSearch 是我从搜索引擎的搜索结果中构建的 JSON 数据...
谢谢,Itamar。
2 个回答
看起来你是在一台Windows电脑上,使用的是希伯来语的设置,默认编码是cp1255
。这个编码是为了支持希伯来文字而设计的,不支持像u'\xe9'
这样的西欧字符,后者是带重音的字母e。
你应该可以在IDLE中运行
print u'\xe9'
并看到打印出带重音的e。
注意:str(some_unicode_string)
只有在默认编码是UTF-something
(通常是UTF-8)或者GB18030时,才能支持所有Unicode字符。在Windows电脑上,默认编码通常是ascii
。而你的编码是'cp1255',这对于任意Unicode字符来说是不够的。
更新:根据评论中提供的新信息:
关于你的urllib.urlencode()
问题:这个函数需要一个str
对象,但你提供的是unicode
对象。Python 2.x会尝试使用系统默认编码(在你的情况下是cp1255
)进行编码。cp1255
无法处理u'\xe9'
,所以才会出现错误信息。你需要确认一下你要连接的网站期望使用什么编码。希望是UTF-8
。不要直接传递the_unicode_string
,而是传递the_unicode_string.encode(website_expected_encoding)
。如果期望的编码是cp1255
或者其他不支持你查询返回的所有Unicode字符的编码(可能是在不同的网站?同一个网站???),那么你就真的很倒霉了,或者你需要仔细检查一下你是怎么得到这些unicode
字符串的。可以参考@bobince的这个回答... 忽略那个接受的答案,因为它信息量少得多。
使用 codecs 模块可以把一个字符串转换成你可以进一步使用的编码(比如打印出来,或者传给其他函数)。最安全的编码方式是ASCII,但它在处理信息时会损失很多内容。
举个例子:
s = "\xe9 and other stuff"
s1 = codecs.encode(codecs.decode(s,'<source-encoding>', 'replace'), 'utf-8')
这段代码会把你的源字符串解码成一个unicode字符串,前提是你要知道它原本是什么编码(你需要查看搜索引擎返回的编码)。replace
参数可以把未知字符替换成 '?'(这会导致信息丢失),但还有其他选项,具体可以查看文档。
然后结果会被编码成目标编码,比如这里的utf-8,如果你想在支持这种编码的终端上打印字符串,这样做是可以的。如果你想进一步处理结果字符串,我建议尽可能保持使用Unicode。
这里有两点需要注意:
- 你需要知道输入字符串的编码是什么。
- 你需要知道目标函数能处理什么编码。比如 'print' 可能是 ascii,而 'urllib.urlencode' 可能是 unicode。
注意:.encode 和 .decode 函数也可以作为字符串的方法使用,所以你可以写 s.decode(...)
等等。