• 3462阅读
  • 4回复

[讨论]求助:QUrl直接发送%u6211而不被编码 [复制链接]

上一主题 下一主题
离线ilvfeng
 

只看楼主 倒序阅读 楼主  发表于: 2018-04-13
背景:要用QUrl模拟浏览器发HTTP包,遇到中文时需编码成%uxxxx的形式
问题:QUrl遇到%uxxxx的形式会编码成%25uxxxx,也就是把%编码成了%25
想问:有办法让他不转吗?
用QUrl::DecodedMode也没效果...
离线kaon

只看该作者 1楼 发表于: 2018-04-13
看下QUrl::EncodeUnicode
离线ilvfeng

只看该作者 2楼 发表于: 2018-04-13
回 kaon 的帖子
kaon:看下QUrl::EncodeUnicode (2018-04-13 15:24) 

还好,有人回复

嗯,我看了下你说的QUrl::EncodeUnicode

1、这个只是控制QUrl在文本输出时的格式吧?文档有说:when used in toString() and toEncoded()
2、我试了下文档中的demo,也是不行。如下:
    QUrl original("http://example.com/?q=%u6211");
    QUrl copy(original);
    copy.setQuery(copy.query(QUrl::EncodeUnicode), QUrl::DecodedMode);
    qDebug()<<original;                // QUrl("http://example.com/?q=%25u6211")
    qDebug()<<copy.toString();    // http://example.com/?q=%2525u6211

可以发现,%u6211在初始化后就被写成了%25u6211
查了下,如果%后带两位数字,是不会有问题的,会被认为是十六进制编码

还是老问题:怎样才能直接输出呢?%u6211
离线ilvfeng

只看该作者 3楼 发表于: 2018-04-13
补充下背景:
因为浏览器是用JS.escape方法把中文转为%uXXXX的格式,然后发送

我现在就想模拟这种效果。已经实现了escape的大体功能,目前遇到的问题就是放入%uXXXX到链接QUrl中后,会被替换为%25u6211
有人解决吗?
或者能实现中文传入QUrl中后会编码成%uXXXX这样的,也行
离线zzs0829

只看该作者 4楼 发表于: 2018-10-05
问题在于,Java或者JavaScript的汉字Unicode表示方式都是“%uXXXX”,Qt中的汉字Unicode表示方式是“\uXXXX”。
所以,字符串“http://example.com/?q=%u6211”应该是JavaScript传过来或者拷贝过来的字符串,要转换一下其中的“%u”。
    QUrl original("http://example.com/?q=\u6211");
    QUrl copy(original);
    copy.setQuery(copy.query(QUrl::FullyDecoded), QUrl::DecodedMode);
    qDebug()<<original;             // QUrl("http://example.com/?q=我")
    qDebug()<<original.toEncoded(); // http://example.com/?q=%E6%88%91 中文的Url标准编码格式
    qDebug()<<copy.toString();      // http://example.com/?q=
快速回复
限100 字节
 
上一个 下一个