V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
N0phone
V2EX  ›  Python

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

  •  1
     
  •   N0phone · 2020-09-01 15:47:30 +08:00 · 1804 次点击
    这是一个创建于 1548 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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'” 应该怎么解决有表哥吗

    13 条回复    2020-09-01 16:43:47 +08:00
    imn1
        1
    imn1  
       2020-09-01 15:56:05 +08:00
    x 是个整数吧?
    字符串+整数 不对
    N0phone
        2
    N0phone  
    OP
       2020-09-01 15:59:06 +08:00
    @imn1 是个 HEX 编码完的十六进制数啊, 我怎么修改主题啊 这个排版怎么这样
    TEwrc
        3
    TEwrc  
       2020-09-01 16:13:07 +08:00
    有一说一这排版不想看。。。
    imn1
        4
    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
        5
    N0phone  
    OP
       2020-09-01 16:16:40 +08:00
    @TEwrc 我发帖的时候是换行的 好奇怪 怎么修改主题内容啊没找到。。
    N0phone
        6
    N0phone  
    OP
       2020-09-01 16:18:03 +08:00
    @imn1 逻辑就是 字符串先 hex 编码 然后每两个字节取一个 组合再前面加上\u00 构成\u00xx 这样能被 json decode 的形式
    imn1
        7
    imn1  
       2020-09-01 16:23:24 +08:00
    unicode 没有 6 位编码,且 00 开头的字符
    只有 \u0000-\u00ff
    \u001234 是错误的,\u1234 才是正确的
    N0phone
        8
    N0phone  
    OP
       2020-09-01 16:28:02 +08:00
    @imn1 对的按照我的逻辑每次取两个字节不是应该只有\u00xx 吗
    imn1
        9
    imn1  
       2020-09-01 16:30:35 +08:00
    算了,我也不了解 py2,可能你的程序也没大问题( py3 第一句就不行了)
    我建议是如果 payload 是字符串的话,转成 utf-8,然后 json.dumps 就足够了
    imn1
        10
    imn1  
       2020-09-01 16:32:26 +08:00
    @N0phone #8
    一个字节是 xx,两个字节是 xxxx
    sudoy
        11
    sudoy  
       2020-09-01 16:41:44 +08:00
    我可能不知道怎么帮助你,但是建议楼主下次发帖的时候,在代码前后加 ```, 就是那个跟波浪号~在同一个建的符号,这样别人帮你看代码的时候看得比较清楚
    myxingkong
        12
    myxingkong  
       2020-09-01 16:42:35 +08:00
    fasionchan
        13
    fasionchan  
       2020-09-01 16:43:47 +08:00   ❤️ 1
    我猜你的 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'
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3421 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 11:23 · PVG 19:23 · LAX 03:23 · JFK 06:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.