如何从URL参数中获取Unicode字符?

3
我需要使用GET请求通过JavaScript客户端将JSON发送到我的服务器,因此我开始回显响应以确保在传输过程中没有丢失任何内容。正常文本似乎没有问题,但是一旦包含任何Unicode字符(例如“ç”),该字符就会被编码(例如“\u00e7”),并且返回值与请求值不同。我的主要关注点是:A) 在我的Python代码中正确保存客户端打算发送到数据库的内容,以及B) 当进行测试时,我回显了发送的相同值给客户端。

也许这意味着我不能使用base64,或者必须在途中做一些不同的事情。我可以接受这个。我的实现只是为达到目的而尝试的手段。

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

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

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

JavaScript中将字符串通过GET参数传递给服务器的Base64编码版本(另外,编码后字符串末尾的等号会引起任何问题吗?):

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

参数进行b64decode后,Python中的str结果:

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

从解码参数的json.loads创建Python dict:

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

以下是从 dict 转换成 json.dumps 的 Python str(并输出到浏览器):

'{"weird-chars": "\u00b0\u00e7"}'
2个回答

3

我认为一切都很好。

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

也许在使用之前,你应该先解码JSON。

@Ignacio - 如果loads仍然是\xb0\xe7十六进制编码,它如何为我提供“解码”值? 我只是想理解。 °是否应存储为数据库中的xb0等,因此您认为它已被“解码”? 或者,您建议在运行loads之前以其他方式“解码”它? 在上面的示例中,我已经使用了loads,在倒数第二步中。 浏览器仍然从最后一步接收字符串,这是不正确的。 - orokusaki
@Ignacio - 好的,现在有意义了。为什么浏览器接收到的是与repr()显示的相同的东西?我是否错过了最后一步? - orokusaki
@Ignacio - 我将把它从JSON解码为JavaScript对象,但我不想再去解码特殊字符。JSON并不要求仅使用ASCII字符。如果我将json.dumps(my_dict)替换为json.dumps(my_dict, ensure_ascii=False),则可以在不编码Unicode字符的情况下工作。那样做会有问题吗? - orokusaki
能够处理“特殊字符”是 JSON 的一部分。如果你用来解码的工具无法处理它们,那么它就不是一个 JSON 库。 - Ignacio Vazquez-Abrams
那我就这么做吧。我不是在争论正确的方法。我只是想理解“正确”方法的“为什么”,以便我不会走错方向。我希望API用户能够使用标准实践,而不必采取额外的步骤,但听起来你是在说JS中的任何JSON.decode()方法都会执行适当的转换。 - orokusaki
显示剩余4条评论

3
您的程序没问题,只需要再增加一步;那就是从Unicode编码转换为utf-8(或任何支持“奇怪字符”的编码)。把解码看作是从正常字符串转换为Unicode所做的操作,而将编码看作是从Unicode转回来的操作。换句话说:
您可以通过解码一个str获得一个unicode字符串,
然后通过编码一个unicode字符串获取一个str
因此:
params = {'weird-chars': u'\xb0\xe7'}

encodedchars = params['weird-chars'].encode('utf-8')

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接