【问题标题】:How to translate an unprintable string to a normal string in python?如何在python中将不可打印的字符串转换为普通字符串?
【发布时间】:2011-08-12 06:14:28
【问题描述】:

我有一个字符串(最初取自搜索引擎的搜索结果),其中包含特殊字符,例如“\xe9”,我只想将这些字符替换为普通字符,以便我可以打印它们(它是一个python程序)。

那我该怎么做呢?它一直给我写这个错误: " 文件 "D:\Python27\lib\encodings\cp1255.py",第 12 行,在编码返回 codecs.charmap_encode(input,errors,encoding_table) UnicodeEncodeError: 'charmap' codec can't encode character u'\xe9' in位置 11:字符映射到未定义"

顺便说一句,当我打印“sys.getdefaultencoding()”时,它会打印:Cp1255

该错误最初发生在此函数调用中:“urllib.urlencode(THE STRING)”,但当我尝试编写“print (firstSearch['Results'][i]['Title'])”时也会发生该错误,其中firstSearch 是我根据搜索引擎的搜索结果构建的 JSON...

tnx,伊塔马尔。

【问题讨论】:

  • 嗯,你想得到哪些字符?您可以将每个字节随机映射到其他字节,但这可能不是您想要的。
  • 什么平台? sys.stdout.encoding 是什么?编辑您的问题以显示完整的回溯和完整的错误消息。
  • Conversion of Unicode 的可能重复项

标签: python character


【解决方案1】:

您似乎在 Windows 机器上,在希伯来语语言环境中,默认编码为 cp1255,它使用高位设置字符来支持希伯来语脚本,而不是像 u'\xe9' 这样的西欧字符是带有锐音的拉丁文小写字母 E。

你应该可以的

print u'\xe9'

在 IDLE 中并观察正在打印的 e-acute。

注意:str(some_unicode_string) 仅在默认编码为 UTF-something(通常为 UTF-8)或 GB18030 时才有实际用途(即支持所有 Unicode 字符)。在 Windows 机器上,它通常是 ascii。你的是 'cp1255',对于任意 Unicode 字符是不行的。

更新在 cmets 提供新信息后:

对于您的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 字符串的。请参阅this answer by @bobince ...忽略已接受的答案,它的信息量要少得多。

【讨论】:

  • 是的,我在 Windows 上,默认编码是 Cp1255。那么如何将字符串转换为常规字符串?我的意图实际上不是打印字符串,而是使用字符串,所以如果我不能打印它,错误将出现在代码的其他行中。此外,调用此函数时发生了原始错误:urllib.urlencode(THE STRING),因此我需要以某种方式将THE STRING转换为正常编码的字符串,以便此函数调用通过。
【解决方案2】:

使用codecs 模块将给定的字符串转换为您可以进一步使用的编码(例如打印或传递给另一个函数)。对于任意目的,最安全的编码当然是 ASCII,但它也是损失最多的编码。

例如

s = "\xe9 and other stuff"
s1 = codecs.encode(codecs.decode(s,'<source-encoding>', 'replace'), 'utf-8')

这会将您的源字符串从编码中解码为 un​​icode 字符串(您需要检查搜索引擎返回的编码)。 replace 参数允许用“?”替换未知字符(这是信息丢失),但还有其他选项,请查看文档。

然后将结果编码为目标编码,例如 utf-8,如果 e.g.您想在支持此编码的终端上打印字符串。如果您想进一步处理结果字符串,我建议您尽可能坚持使用 Unicode。

这里需要注意两点:

  • 您需要知道输入字符串的编码是什么。
  • 您需要知道目标函数可以处理什么编码。这对于 'print' (ascii?) 和 'urllib.urlencode' (unicode?) 可能有所不同。

注意:.encode 和 .decode 函数也可用作字符串方法,因此您可以编写 s.decode(...) 等。

【讨论】:

  • -1 因为 (1) 完全提及 codecs.encode 和 codecs.decode 构成混淆 (2) 一般提及“字符串方法”而不说“坚持 str.decode 和 unicode.encode;避免unicode.decode 和 str.encode(在 Python 3 中消失)除非你确切地知道你在做什么”是没有帮助的(3)'unicode` 不是编码(4)urllib.urlencode(它的名字本来可以更好地选择)期望str 对象并返回一个str 对象;用于产生输入的编码与该功能无关,但客户端和服务器当然需要知道。
  • @John 我发现您的评论颇具破坏性。我想不出为什么提到相关的 Python 模块应该是“混淆”(1)。我还认为您不能将所有最佳实践都放在答案中,否则我们会写书(尽管这会做出很好的评论),但希望 OP 进一步研究并下定决心(2)。您的答案也不能 100% 准确,我使用术语“unicode”来指代 Python 数据类型及其编码(例如 UCS-2)(3)。并且 urllib.urlencode 显然不能处理任意字符串,因此首先是这个问题(4)。
  • (1) 这是一种混淆,因为 0.0001% 的人使用它的编码/解码功能,而世界其他地方则使用 str/unicode 方法。如果有的话,您应该最后提到编解码器功能。 (2) 如果 OP “进一步研究”,他们就不会在这里提问。 (3)“unicode”不是“UCS-2”,也不是编码;这不是“不精确”,而是错误的。 (4) 你又跑题了:urllib.urlencode 可以处理任意的str 对象。 建议(“unicode?”)它可以处理unicode 对象。你把“str”和“string”混为一谈了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多