我使用了this question中找到的函数,适用于用“%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;
}
但是,当我尝试将其用于Local Live Test Server
之类的字符串时,输出为:
我的上一个问题涉及string
个问题,发现string
typedef
指向我正在使用的游戏SDK中的内部CryString
类型(CryEngine2) )。我现在正在使用std::string
来解决此问题。
此问题也反映在我转换发生后使用的数据库中,并将数据发送到数据库:
为什么我不能以这种方式使用%20
(可能还有其他URL编码符号),以及如何才能使其工作?
我试图对此进行一些研究,以便自己解决问题,但是没有任何相关内容出现。
我已尝试使用*it = (char)"%20";
代替*it = (char)"%20";
,但这实际上删除了字符串中出现的0
,而不是用%20
替换空格
答案 0 :(得分:9)
因为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;
虽然经过一些仔细的编程,但可以直接在原始字符串中进行。
答案 1 :(得分:5)
我尝试过使用* it =(char)“%20”;代替* it =(char)“%20”;,但是这实际上删除了出现在字符串中的0而不是用%20替换空格。
请不要将糟糕的PHP习惯应用于C ++,你不能只是说“假装这个字符串是一个单一的字符”,并期待任何明智的事情。 "%20"
是一个数组,将其转换为char
获取第一个元素的地址(这是一个32位或64位指针值),然后将其截断为{{1}的大小
char
是一个字符,'%'
是一个字符,但'2'
不是字符,因此您无法明智地将其分配给'%20'
。
(技术上char
是一个带有实现定义值的多字符常量,我的编译器是'%20'
,这显然太大而不适合我的编译器的8位字符)< / p>
2.13.3 [lex.ccon]说:
包含多个 c-char 的普通字符文字是多字符文字。包含单个 c-char 的多字符或普通字符文字在执行字符集中无法表示,它是有条件支持的,类型为
0x253230
,并且具有实现定义的值。
有几种方法可以用字符串替换单个字符(AndreyT的答案显示了一个很好的简单方法),但只是尝试将不是int
的东西粉碎到包含单个char
的内存字节中永远不会起作用。