【问题标题】:How to send utf8-encoded json string by tcp in Python?如何在 Python 中通过 tcp 发送 utf8 编码的 json 字符串?
【发布时间】:2015-04-04 06:12:26
【问题描述】:

我拼命地试图通过 tcp (Python 2.7) 发送一个 utf8 编码的 json 字符串。这里有一些尝试和结果。变量响应包含我要发送的 json 字符串:

reponse = {"candidats":{"P":[{"mentionname":"Beyoncé","guess":[{"name":"BEYONCÉ","score":"1.00","eid":"72437"}]}],"E":[]}}

命令1:

self.request.sendall(json.dumps(reponse+"\n",ensure_ascii=False))

导致错误:

    'ascii' codec can't encode character u'\xe9' in position 49: ordinal not in range(128)

命令2:

self.request.sendall(json.dumps(reponse+"\n",encoding='utf8')):

在另一端(tcp 客户端)提供输出,但 Beyoncé 的最后一个字符不是好字符:

   "{\"candidats\":{\"P\"[{\"mentionname\":\"Beyonc\u00e9\",\"guess\":[{\"name\":\"BEYONC\u00c9\",\"score\":\"1.00\",\"eid\":\"72437\"}]}],\"E\":[]}}\n"

(客户端使用 message.decode('UTF-8') 收到消息)。

命令3:

self.request.sendall(json.dumps(reponse+"\n",ensure_ascii=False,encoding='utf8')):

导致错误:

    'ascii' codec can't encode character u'\xe9' in position 49: ordinal not in range(128)

命令4:

self.request.sendall(json.dumps(reponse+"\n").encode('utf8')):

在另一端(tcp 客户端)提供输出,但 Beyoncé 的最后一个字符不是好字符:

    "{\"candidats\":{\"P\":[{\"mentionname\":\"Beyonc\u00e9\",\"guess\":[{\"name\":\"BEYONC\u00c9\",\"score\":\"1.00\",\"eid\":\"72437\"}]}],\"E\":[]}}\n"

命令5:

self.request.sendall(json.dumps(reponse+"\n",ensure_ascii=False).encode('utf8')):

在另一端给出输出,Beyoncé 的最后一个字符是好的,但双引号被转义:

    "{\"candidats\":{\"P\":[{\"mentionname\":\"Beyoncé\",\"guess\":{\"name\":\"BEYONCÉ\",\"score\":\"1.00\",\"eid\":\"72437\"}]}],\"E\":[]}}\n"

最后一次尝试几乎是好的,除了那些烦人的转义双引号。我知道这是因为字符串是double encoded,但目前我没有其他选择来选择这个解决方案并消除我的 tcp 客户端代码中的反斜杠。

有人有更好的解决方案吗? 非常感谢任何提示! 问候, 帕特里克

【问题讨论】:

    标签: python json unicode tcp


    【解决方案1】:

    您似乎将文本放入源中的response 变量中,他们设置源文件编码以便源文件中的前两行读取:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    

    更多信息可以在PEP 0263找到。

    【讨论】:

    • 谢谢多诺万,但你能否更详细地解释你的答案,我不明白。
    • 如果您的意思是删除前 2 行(源文件编码),它不会改变任何结果。但也许这不是你的意思。
    • 我的意思是添加 coding: utf8 部分,因为字符串在源文件中。设置无效吗?
    • coding:utf8 片段已经存在。我以为你说要删除它。
    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 2016-05-31
    • 2013-02-27
    • 2013-05-15
    • 2013-06-28
    • 2014-01-01
    • 1970-01-01
    • 2018-02-18
    相关资源
    最近更新 更多