V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wbing
V2EX  ›  问与答

libcurl 通过 http url 获取文件,当 url 中带有中文时,就无法成功取到。

  •  
  •   wbing · 2017-04-10 13:51:50 +08:00 · 2279 次点击
    这是一个创建于 2565 天前的主题,其中的信息可能已经有所发展或是发生改变。

    url: http://127.0.0.1:8080/测试_12_3_随机_1.jpeg

    有考虑过用 curl_easy_escape 转码,但发现只有单独把中文转码然后替换,才能正确访问。把整个 url 转码会不正常

    所以c++有什么办法可以解决的???只能通过去截取字符串中的中文去编码替换吗???

    第 1 条附言  ·  2017-04-11 10:31:49 +08:00
    问题解决了,我原先的那串 url 是 gb2312 的,我把它转成 utf-8 ,然后就可以正常取到数据了。
    5 条回复    2017-04-11 10:31:19 +08:00
    msg7086
        1
    msg7086  
       2017-04-10 14:11:15 +08:00
    帮你搜了。就是应该用 curl_easy_escape 解决。你是连着前面的地址部分一起喂进去了?
    abcbuzhiming
        2
    abcbuzhiming  
       2017-04-10 15:00:32 +08:00   ❤️ 1
    你需要补充一下 Http 协议和 url 编码(urlencode)的知识, url 标准规定, url 地址中, URI (路径), queryString 部分,都应该进行编码,所谓编码,就是所有的非 Ascii 字符都应该转为 url unicode 编码形式,就像这%2c 。但是要注意的。 Ascii 码里除了英文字母外基本就没有了,在它看来比如冒号,斜杠,这些都是要转码的,所以你一旦对整个 url 转码,你的 http 后面的冒号,斜杠也被转码了, http url 就被破坏了, curl 的转码函数不是很智能,像 php 就有只转 querystring ,和能识别哪些内容是协议头,主机域名端口所以略过不转的,但是 curl 不行,所以你必须指定哪些内容让它转,哪些保持不动,最后拼接处理结果。用 C++处理字符串就是很麻烦,不像后来的语言那么完善,自己得小心
    Arthur2e5
        3
    Arthur2e5  
       2017-04-10 22:24:18 +08:00   ❤️ 1
    @abcbuzhiming ASCII 码当然不是“除了英文就没有了”。 0x00 到 0x7f 都是 ASCII 。

    urlencode 的“编码”主要可不是为了什么包含 ASCII 没有的字符。 urlencode 的主要目的是杀掉有特殊含义的字符以及难以看到的特殊字符,只留下一组比较安全的字符(例如字母、数字、下划线)。? 可能理解为 query 、% 可能理解为 urlencode 本身得到的 escape 、# 可能理解为 fragment 、/ 可能理解为目录层级,这些都要杀。和表示字符串常量的时候用反斜杠伺候反斜杠和换行符之类的东西是一个意思。

    然后 C++ 字符串拼接很麻烦吗?“很麻烦”的是 C 字符串吧……
    abcbuzhiming
        4
    abcbuzhiming  
       2017-04-11 09:25:06 +08:00   ❤️ 1
    @Arthur2e5 好吧,我描述不准确,主要是我懒得去翻文档,总之 ascii 除了英文+数字,就剩下一些基本符号了

    另外, C++字符串拼接怎么不麻烦啊,"字符串" + 变量名,这种方式居然无法工作,你知道这多让人崩溃吗。 C++的字符串处理能力比起 C 来真没啥本质变化, string 带来的历史遗留问题导致 wstring 不能很好的普及,而且很多和字符串有关的 api 都是按字节拷贝的,现代字符处理能力希望的都是屏蔽掉字节层次,专注处理字符
    wbing
        5
    wbing  
    OP
       2017-04-11 10:31:19 +08:00
    @msg7086
    @Arthur2e5
    @abcbuzhiming

    谢谢各位,问题解决了,我那串 url 是 gb2312 的,我把它转成 utf-8 ,然后就可以正常取到数据了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1209 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 23:22 · PVG 07:22 · LAX 16:22 · JFK 19:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.