url: http://127.0.0.1:8080/测试_12_3_随机_1.jpeg
有考虑过用 curl_easy_escape 转码,但发现只有单独把中文转码然后替换,才能正确访问。把整个 url 转码会不正常
所以c++有什么办法可以解决的???只能通过去截取字符串中的中文去编码替换吗???
1
msg7086 2017-04-10 14:11:15 +08:00
帮你搜了。就是应该用 curl_easy_escape 解决。你是连着前面的地址部分一起喂进去了?
|
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++处理字符串就是很麻烦,不像后来的语言那么完善,自己得小心
|
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 字符串吧…… |
4
abcbuzhiming 2017-04-11 09:25:06 +08:00 1
@Arthur2e5 好吧,我描述不准确,主要是我懒得去翻文档,总之 ascii 除了英文+数字,就剩下一些基本符号了
另外, C++字符串拼接怎么不麻烦啊,"字符串" + 变量名,这种方式居然无法工作,你知道这多让人崩溃吗。 C++的字符串处理能力比起 C 来真没啥本质变化, string 带来的历史遗留问题导致 wstring 不能很好的普及,而且很多和字符串有关的 api 都是按字节拷贝的,现代字符处理能力希望的都是屏蔽掉字节层次,专注处理字符 |
5
wbing OP |