关于 Python 如何处理 json 数据转义的问题

2020-09-01 15:47:30 +08:00
 N0phone

def tamper(payload,**kwargs): line = payload.encode('hex') n=2 groups = [line[i:i+n] for i in range(0,len(line),n)] full = '' for x in groups: full = full + '\u00' +x retVal = full return retVal

我有一段 python 程序,运行环境是 linux,python2 想要把我的数据 转成\u00xx 这样的 json 能解析的数据然后发包请求,但是在实际过程中出现报错

'unicodeescape' codec can't decode bytes in position 0-3: truncated \uXXXX escape 然后我将 '\u00'更改为 r'\u00'之后报另一个错误 LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs'” 应该怎么解决有表哥吗

1733 次点击
所在节点    Python
13 条回复
imn1
2020-09-01 15:56:05 +08:00
x 是个整数吧?
字符串+整数 不对
N0phone
2020-09-01 15:59:06 +08:00
@imn1 是个 HEX 编码完的十六进制数啊, 我怎么修改主题啊 这个排版怎么这样
TEwrc
2020-09-01 16:13:07 +08:00
有一说一这排版不想看。。。
imn1
2020-09-01 16:13:56 +08:00
试试 str(x)
我不太熟 py2 的编码机制

如果按 py3 的理解,这个程序就是错的,lines 是字节串,x 也就是 line[i:i+2] 是双字节
双字节前面加 \u00,这个逻辑完全没理解

如果 payload 本身就是 str 的话,用 json 模块直接转 json 串好像更简单
N0phone
2020-09-01 16:16:40 +08:00
@TEwrc 我发帖的时候是换行的 好奇怪 怎么修改主题内容啊没找到。。
N0phone
2020-09-01 16:18:03 +08:00
@imn1 逻辑就是 字符串先 hex 编码 然后每两个字节取一个 组合再前面加上\u00 构成\u00xx 这样能被 json decode 的形式
imn1
2020-09-01 16:23:24 +08:00
unicode 没有 6 位编码,且 00 开头的字符
只有 \u0000-\u00ff
\u001234 是错误的,\u1234 才是正确的
N0phone
2020-09-01 16:28:02 +08:00
@imn1 对的按照我的逻辑每次取两个字节不是应该只有\u00xx 吗
imn1
2020-09-01 16:30:35 +08:00
算了,我也不了解 py2,可能你的程序也没大问题( py3 第一句就不行了)
我建议是如果 payload 是字符串的话,转成 utf-8,然后 json.dumps 就足够了
imn1
2020-09-01 16:32:26 +08:00
@N0phone #8
一个字节是 xx,两个字节是 xxxx
sudoy
2020-09-01 16:41:44 +08:00
我可能不知道怎么帮助你,但是建议楼主下次发帖的时候,在代码前后加 ```, 就是那个跟波浪号~在同一个建的符号,这样别人帮你看代码的时候看得比较清楚
myxingkong
2020-09-01 16:42:35 +08:00
fasionchan
2020-09-01 16:43:47 +08:00
我猜你的 payload 是一个字节序列,它可能是 utf8 或者 gbk 编码的,它的 base16 编码并不是合法的 unicode 呀……
这没理解文本编码的结果,不如先看看文本编码是怎么回事: https://python.fasionchan.com/zh_CN/latest/practices/coding.html

为什么要自己拼接呢?按我的理解,你把数据解码成 unicode 字符串,然后调 repr 或 json.dumps 不就可以得到\uxxxx 这种形式了吗?

```
>>> data = '我们'
>>> data
'\xe6\x88\x91\xe4\xbb\xac'
>>> data.decode('utf8')
u'\u6211\u4eec'
>>> repr(data.decode('utf8'))[2:-1]
'\\u6211\\u4eec'
>>> json.dumps(data.decode('utf8'))[1:-1]
'\\u6211\\u4eec'
```

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

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

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

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

© 2021 V2EX