-3 c++ string url-encoding sfml crysis
我使用了一个我在这个问题中找到的函数,适用于用"%20"替换所有空格(可能会更有效地完成!):
## Heading ##std::string Main::SpacesForWeb(std::string text) {
for (std::string::iterator it = text.begin(); it != text.end(); ++it) {
if (*it == ' ') {
*it = '%20';
}
}
return text;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试将它用于字符串时Local Live Test Server,输出是这样的:

我的最后一个问题涉及string的问题,并发现string被typedef编为指向内部CryString在游戏SDK类型我使用(Cryengine2引擎).我现在正在使用std::string以解决这个问题.
此问题也反映在我转换发生后使用的数据库中,并将数据发送到数据库:

为什么我不能%20以这种方式使用(也许还有其他URL编码符号),我怎样才能使它工作?我试图对此进行一些研究以便自己解决这个问题,但是没有任何相关内容出现.
我已尝试使用*it = (char)"%20";原位*it = (char)"%20";,但是这实际上删除了0出现在字符串中而不是替换空格%20.
因为C++语言对任何"URL编码"一无所知.从C++语言的角度来看,你'%20'是一个多字符常量,它指定了一些实现定义的类型值char(多字符常量是C和C++语言的一个模糊特征).
如果您希望(或必须)"%20"在字符串中使用以传递给某个知道URL的收件人,则必须将"%20"作为子字符串(三个字符)插入到字符串中.
您尝试将字符串文字转换"%20"为字符类型将无法实现.不可能将三个字符挤入一个字符的位置.您必须"移动"字符串的尾部,以便为一个以前居住的三个字符提供空间.
在这种情况下,在单独的字符串中生成新结果可能更有意义
std::string new_text;
for (std::string::const_iterator it = text.begin(); it != text.end(); ++it) {
if (*it == ' ')
new_text += "%20";
else
new_text += *it;
}
return new_text;
Run Code Online (Sandbox Code Playgroud)
虽然通过一些仔细的编程,可以直接在原始字符串中进行.
我尝试过使用*it =(char)"%20"; 代替*it =(char)"%20";,但是这实际上删除了出现在字符串中的0而不是用%20替换空格.
请不要将糟糕的PHP习惯应用于C++,你不能只是说"假装这个字符串是一个单个字符"并且期望任何合理的东西."%20"是一个数组,将其转换为char获取第一个元素的地址(这是一个32位或64位指针值),然后将其截断为大小为a char,可能是8位,这将给你垃圾.
'%'是一个角色,'2'是一个角色,但'%20'不是一个角色,所以你不能明智地把它分配给一个角色char.
(从技术上讲,它'%20'是一个带有实现定义值的多字符常量,对于我的编译器来说0x253230,它显然太大而不适合我的编译器的8位字符)
2.13.3 [lex.ccon]说:
包含多个c-char的普通字符文字是多字符文字.包含单个c-char的多字符或普通字符文字在执行字符集中无法表示,它是有条件支持的,具有类型
int,并具有实现定义的值.
有几种方法可以用字符串替换单个字符(AndreyT的答案显示了一个很好的简单方法),但只是试图粉碎那些不属于char存储单元的内存字节的东西char永远不会起作用.
| 归档时间: |
|
| 查看次数: |
1159 次 |
| 最近记录: |