【问题标题】:python unicode to original text character when being used as string not when printingpython unicode到原始文本字符时用作字符串而不是打印时
【发布时间】:2016-12-29 19:05:20
【问题描述】:

我想要从方法中获取的 unicode 字符串,我希望看起来像原始文本字符而不是 unicode。

a=u'\u2018\u0997\u09c7\u09ae\u09bf\u0982 \u09aa\u09cd\u09b2\u09be\u099f\u09ab\u09b0\u09cd\u09ae\u2019 \u09a4\u09c8\u09b0\u09bf \u0995\u09b0\u09ac\u09c7 \u09ab\u09c7\u09b8\u09ac\u09c1\u0995'

print a #‘গেমিং প্লাটফর্ম’ তৈরি করবে ফেসবুক

打印总是有效,但我的用例不同。它正在打印的东西,我希望它把它放在我的 RESTful API 上,或者至少我想将它用作原始字符的字符串,如果我离开,我的客户将在 html 上使用它不会可以轻松使用它,我怀疑。

最终结果应该是这样的:

{title: ‘গেমিং প্লাটফর্ম’ তৈরি করবে ফেসবুক }

但是 json 转储是这样的:

json.dumps({'a': u})
'{"a": "\\\\u0996\\\\u09be\\\\u09b2\\\\u09bf\\\\u09df\\\\u09be\\\\u099c\\\\u09c1\\\\u09b0\\\\u09c0\\\\u09a4\\\\u09c7 \\\\u09a6\\\\u09c1\\\\u0987 \\\\u0997\\\\u09cd\\\\u09b0\\\\u09c1\\\\u09aa\\\\u09c7\\\\u09b0 \\\\u09b8\\\\u0982\\\\u0998\\\\u09b0\\\\u09cd\\\\u09b7\\\\u09c7 \\\\u09a8\\\\u09be\\\\u09b0\\\\u09c0\\\\u09b8\\\\u09b9 \\\\u0986\\\\u09b9\\\\u09a4 \\\\u09e7\\\\u09e6"}'

所以,我可能需要类似的东西,

blog={}
blog['title']= str(a) # or something else 

到目前为止我已经尝试过,但到目前为止没有运气:

>>> str(a) 

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

>>> a.encode('utf-8')
'\xe2\x80\x98\xe0\xa6\x97\xe0\xa7\x87\xe0\xa6\xae\xe0\xa6\xbf\xe0\xa6\x82 \xe0\xa6\xaa\xe0\xa7\x8d\xe0\xa6\xb2\xe0\xa6\xbe\xe0\xa6\x9f\xe0\xa6\xab\xe0\xa6\xb0\xe0\xa7\x8d\xe0\xa6\xae\xe2\x80\x99 \xe0\xa6\xa4\xe0\xa7\x88\xe0\xa6\xb0\xe0\xa6\xbf \xe0\xa6\x95\xe0\xa6\xb0\xe0\xa6\xac\xe0\xa7\x87 \xe0\xa6\xab\xe0\xa7\x87\xe0\xa6\xb8\xe0\xa6\xac\xe0\xa7\x81\xe0\xa6\x95'

>>> a.encode('utf8')
'\xe2\x80\x98\xe0\xa6\x97\xe0\xa7\x87\xe0\xa6\xae\xe0\xa6\xbf\xe0\xa6\x82 \xe0\xa6\xaa\xe0\xa7\x8d\xe0\xa6\xb2\xe0\xa6\xbe\xe0\xa6\x9f\xe0\xa6\xab\xe0\xa6\xb0\xe0\xa7\x8d\xe0\xa6\xae\xe2\x80\x99 \xe0\xa6\xa4\xe0\xa7\x88\xe0\xa6\xb0\xe0\xa6\xbf \xe0\xa6\x95\xe0\xa6\xb0\xe0\xa6\xac\xe0\xa7\x87 \xe0\xa6\xab\xe0\xa7\x87\xe0\xa6\xb8\xe0\xa6\xac\xe0\xa7\x81\xe0\xa6\x95'

>>> a.__str__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

>>> a.decode('utf8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128)

【问题讨论】:

  • 您的 JSON 输出示例在我看来是错误的,repr() 应该将其转换为 '{"a": "\\u0996..."}',而不是 '{"a": "\\\\u0996..."}'。可能您是通过写a="\u0996..." 而不是a=u"\u0996..." 来打印的。

标签: python html string unicode utf-8


【解决方案1】:

您误解了 Python 对象的 repr。文字字符串中的这些转义实际上在内部转换为当您 print 时 Python 显示的“真实”字符(也就是说,在内部,它为每个转义存储一个 Unicode 序号,而不是转义本身)。除非您需要特定编码中的原始字节(并且解码它是荒谬的;unicode 对象在 Py2 中具有该方法,但使用它通常是错误的,因为 unicode 是根据定义的,否则您不需要对其进行编码不是编码字节)。

基本上,只需使用您拥有的 unicode 对象,它就是您所期望的文本,当您使用交互式解释器时,它可能不会以这种方式显示(它与对象的 reprs 相呼应,它显示转义而不是实际字符,部分是为了确保如果您缺乏字体或语言支持来显示真实字符,它不会出错)。 Unicode 友好库将完全按照您期望的方式使用它,长度通常是字符数(在 Py2 中,在具有非 BMP 序数的 16 位 wchar 系统上,这可能不是真的,但通常是真的)。​​

也就是说,对于任何非 ASCII 密集型工作,我建议切换到 Python 3; Python 2 对 Unicode 的支持不太一致,并且有更多的差距和陷阱。许多第三方软件包,甚至一些内置软件包 (cough csv cough) 对 unicode 不友好,因此您最终需要明确地 encode使用它们,然后decode 他们的结果。

【讨论】:

  • 我希望它作为一个 RESTful API 服务,所以将其保持为 unicode 形式是一件好事,这意味着什么?但我不喜欢这样一个事实,即当它将作为浏览器上的 API 提供时,我无法阅读那里所写的内容。有什么我可以做的吗?
  • @sadaf2605:REST API 通常有自己特定的数据传输格式,例如JSON。通常,您会获取您制作的字典,将其传递给json.dump/json.dumps,然后将它产生的内容发送到网络上(如果您告诉他们发送dict,许多框架会自动为您执行此操作)。另一端的接收器然后用他们自己的 JSON 库(甚至可能不是 Python 的)解析它接收到的内容,但只要你生成了合法的 JSON,他们就可以按照他们喜欢的方式解析它;如果他们的解析器是标准化的,它应该得到相同的逻辑结果。
  • 感谢您到目前为止对我的帮助,但是 json.dump 上的 unicoded 字典似乎使情况变得更糟! :(
  • @sadaf2605:这不是“更糟”,它是 JSON 编码的。关键是它是一种非 Python 特定的编码,可以由接收方的任何 JSON 库解释。互联网以具有特定编码的字节工作,它不能发送字符的逻辑概念,而是以双方同意的格式定义字符的字节。
  • 感谢您的耐心和澄清,我真的很感激 :)
猜你喜欢
  • 2021-12-17
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多