Python 3 中如何解决字典对字符串进行转义

2020-01-21 11:17:04 +08:00
 euzen
str = "源代码"
bytes = str.encode('utf-8')
str2 = bytes.decode('iso-8859-1')
dict = {"key": str2}
print(bytes)
print(str2)
print(dict)

运行结果:
b'\xe6\xba\x90\xe4\xbb\xa3\xe7\xa0\x81'
源代码
{'key': 'æº\x90代ç\xa0\x81'}

赋值给字典后,会对小于\xa1 的字节进行转义,当使用 request.post 进行文件上传时,files 参数中涉及中文文件名就无法正确提交,有什么办法可以解决?
6722 次点击
所在节点    Python
38 条回复
InkStone
2020-01-21 11:23:41 +08:00
这跟字典没什么关系吧。单纯是__repr__和__str__两个模式的输出不一样。

你这个操作是什么意思?为什么要用 utf-8 编码,用 iso88591 解码?编码错误,传得上去才见鬼了吧
marquina
2020-01-21 11:24:41 +08:00
实在没看懂这是什么操作……iso-8859-1 又不包含中文
zdnyp
2020-01-21 11:25:03 +08:00
3.6 str2 和 dict['key']的结果是一样的

编码转的是不是有点没必要?
euzen
2020-01-21 11:31:50 +08:00
@InkStone 服务器就是接受 iso-8859-1 编码,没有服务器方面的代码,不知道是怎么回事。也是试也好久解决这个中文的问题。
euzen
2020-01-21 11:34:23 +08:00
@marquina 将 ‘源代码’提交到服务器是出错的,必须提交'\xe6\xba\x90\xe4\xbb\xa3\xe7\xa0\x81' 才可以。
euzen
2020-01-21 11:37:52 +08:00
@zdnyp 对 python 还是新接触,既然 3.6 结果是一样,那么 3.7 是不是有什么参数,开关可以做到输出一样的结果?
euzen
2020-01-21 11:42:24 +08:00
重点不是编码,是为什么赋值给字典后,字典会进行转义。
ungrown
2020-01-21 11:44:18 +08:00
编解码不一致真的是迷
你哪怕统一转换成 base64 也不这样靠谱
marquina
2020-01-21 11:45:27 +08:00
@euzen 服务器只接受 iso-8859-1 编码就代表服务器不接受中文……这个时候要想给服务器中文,唯一的办法不就是让服务器支持 utf-8 等编码吗……
jyyx
2020-01-21 11:46:25 +08:00
看下__repr__和 __str__的区别
你把发出来的代码最后一行改成 print(dict["key"])
Schalkiii
2020-01-21 11:47:27 +08:00
代码里面不要写中文啥事没有...
euzen
2020-01-21 11:50:58 +08:00
@marquina 我提交 iso-8859-1 的值上去,服务器会转换出中文,并非服务器不支持 utf-8,而且无法控制服务器行为。
Akikiki
2020-01-21 11:51:29 +08:00
为什么要用关键字做变量
euzen
2020-01-21 11:55:10 +08:00
@jyyx 噢,得到了相同的结果。也大概了解了一下__repr__和__str__。第一个解答也是切中要点的。

但更让我迷茫了,看来是搞错了方向,要继续研究解决方案。
imn1
2020-01-21 12:05:35 +08:00
不是,你现在上传有问题吗?什么问题?
你纠结转义干嘛?\x80~\xa0 是不可视字符,当然转义啦
imn1
2020-01-21 12:08:44 +08:00
你要上传的格式是什么?
字典本身是不能上传的,字符串?那不就是 json 么? dict2json,根本不需要理会编码,中文都变成\uxxxx 格式了
lc1450
2020-01-21 12:40:02 +08:00
我猜你需要这个

```
>>> from urllib.parse import quote
>>> quote("哈哈")
'%E5%93%88%E5%93%88'
>>> quote("哈哈",encoding='gbk')
'%B9%FE%B9%FE'
```
euzen
2020-01-21 13:21:14 +08:00
@imn1 上传文件,使用 request.post,里面有个参数是 files,传一个字典进去即可,字典有三项,第一是文件名,第二是字节流,第三个是协议格式。如果我文件名是全英文的话没问题,中文则上传成功,但服务器那边解析不出中文文件名,最后结果出错了。
euzen
2020-01-21 13:23:01 +08:00
@lc1450 这种方案已经试过来,服务器上是原样出来的,比如 哈哈.txt ,按这样解码,提交上去后服务器显示 %E5%93%88%E5%93%88.txt ,并不是我想要的结果。
also24
2020-01-21 13:26:21 +08:00
咦,昨天群里有个人在问这个,我直接复制下我的回答:


「 暴走的熊猫: python2 用 requests 库上传文件时,如果文件名是中文,上传失败,度娘一圈给的原因是中文文件名被进行 RFC 2231 编码了,导致找不到文件,给的解决方法被都是改源码,大佬们有其他方法么? 」
- - - - - - - - - - - - - - -
翻了一下,这个似乎是 urllib3 的锅
https://github.com/psf/requests/issues/4652
https://github.com/urllib3/urllib3/issues/303

而 urllib3 似乎已经在 1.25 版本里修好了这个问题
https://github.com/urllib3/urllib3/pull/1492
https://github.com/urllib3/urllib3/blob/master/CHANGES.rst#125-2019-04-22

你要不要看下你的 pip 或者 venv 里的 urllib3 的版本号

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639618

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX