【问题标题】:How can I get unicode characters from a URL parameter?如何从 URL 参数中获取 unicode 字符?
【发布时间】:2010-12-17 20:17:04
【问题描述】:

我需要使用 GET 请求通过 JavaScript 客户端将 JSON 发送到我的服务器,因此我开始回显响应以确保在翻译过程中不会丢失任何内容。普通文本似乎没有问题,但是只要我包含任何类型的 Unicode 字符(例如“ç”),该字符就会以某种方式编码(例如“\u00e7”)并且返回值不同于请求值。我主要担心的是,A) 在我的 Python 代码中保存了客户端打算正确发送到数据库的内容,并且 B) 我将相同的值回显给客户端已发送(测试时)。

也许这意味着我不能使用 base64,或者必须在此过程中做一些不同的事情。我没问题。我的实现只是一种达到目的的尝试。

当前步骤(如果需要,可以更改任何步骤):

我要发送到服务器的原始 JSON 字符串:

'{"weird-chars": "°ç"}'

通过 GET 参数传递给服务器的字符串的 JavaScript Base64 encoded 版本(附带说明,编码字符串末尾的等号会导致任何问题吗?):

http://www.myserver.com/?json=eyJ3ZWlyZC1jaGFycyI6ICLCsMOnIn0=

Python str 来自 b64decode 的参数:

'{"weird-chars": "\xc2\xb0\xc3\xa7"}'

Python dict from json.loads 的解码参数:

{'weird-chars': u'\xb0\xe7'}

Python strjson.dumpsdict(以及随后输出到浏览器):

'{"weird-chars": "\u00b0\u00e7"}'

【问题讨论】:

    标签: python unicode encoding character-encoding special-characters


    【解决方案1】:

    在我看来一切都很好。

    >>> hex(ord(u'°'))
    '0xb0'
    >>> hex(ord(u'ç'))
    '0xe7'
    

    也许您应该在尝试使用 JSON 之前对其进行解码。

    【讨论】:

    • @Ignacio - 我不能简单地遍历字符串中的每个字符并使用hex(ord(char)) 进行转换。有没有一种方法可以保证字符将正确存储在数据库中(在上面的 Python dict 步骤中),并将它们正确返回到浏览器(即未编码),同时不会导致任何问题或潜在的错误?正确地,我的意思是如果用户输入ççç 作为他们的名字,当他们回到页面时,他们的名字不会显示为0xe70xe70xe7
    • @Ignacio - loads 如何让我得到“解码”值,如果它仍然是 \xb0\xe7 十六进制编码?我只是想明白。 ° 是否应该在数据库中存储为 xb0 等,所以您认为这是“解码”的?或者,您是否建议在运行loads 之前以其他方式“解码”它?在上面的示例中,我已经在上一步的第二步中使用了loads。浏览器仍在接收上一步的字符串,这是不正确的。
    • @Ignacio - 好的,现在说得通了。为什么浏览器收到的内容与repr() 显示的内容相同?最后有没有我遗漏的步骤?
    • @Ignacio - 好的,谢谢。我以前以为您只是在回答中的意思是在服务器端解码。
    • 不解码的情况下如何在客户端使用 JSON?
    【解决方案2】:

    您的程序很好,您只需要多走 1 步;也就是说,从 unicode 编码到 utf-8(或任何其他支持“奇怪字符”的编码。)

    解码 视为从常规字符串 unicode 所做的工作,将 encoding 视为返回 来自 unicode。换句话说:

    de - 编码 str 以产生 unicode 字符串

    en - 编码 unicode 字符串以生成 str

    所以:

    params = {'weird-chars': u'\xb0\xe7'}
    
    encodedchars = params['weird-chars'].encode('utf-8')
    

    encodedchars 将包含您的字符,以所选编码显示(在本例中为utf-8)。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 1970-01-01
      • 2012-07-13
      • 2016-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 2010-10-14
      相关资源
      最近更新 更多