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

2017-04-10 13:51:50 +08:00
 wbing

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

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

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

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

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

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

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

谢谢各位,问题解决了,我那串 url 是 gb2312 的,我把它转成 utf-8 ,然后就可以正常取到数据了。

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

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

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

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

© 2021 V2EX