为什么我不能在字符串中使用“%20”?

时间:2014-11-22 19:52:42

标签: c++ string sfml url-encoding crysis

我使用了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之类的字符串时,输出为:

enter image description here

我的上一个问题涉及string个问题,发现string typedef指向我正在使用的游戏SDK中的内部CryString类型(CryEngine2) )。我现在正在使用std::string来解决此问题。

此问题也反映在我转换发生后使用的数据库中,并将数据发送到数据库:

enter image description here

为什么我不能以这种方式使用%20(可能还有其他URL编码符号),以及如何才能使其工作? 我试图对此进行一些研究,以便自己解决问题,但是没有任何相关内容出现。

我已尝试使用*it = (char)"%20";代替*it = (char)"%20";,但这实际上删除了字符串中出现的0,而不是用%20替换空格

2 个答案:

答案 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}的大小

,大概是8位,这会给你带来垃圾。

char是一个字符,'%'是一个字符,但'2'不是字符,因此您无法明智地将其分配给'%20'

(技术上char是一个带有实现定义值的多字符常量,我的编译器是'%20',这显然太大而不适合我的编译器的8位字符)< / p>

2.13.3 [lex.ccon]说:

  

包含多个 c-char 的普通字符文字是多字符文字。包含单个 c-char 的多字符或普通字符文字在执行字符集中无法表示,它是有条件支持的,类型为0x253230,并且具有实现定义的值。

有几种方法可以用字符串替换单个字符(AndreyT的答案显示了一个很好的简单方法),但只是尝试将不是int的东西粉碎到包含单个char的内存字节中永远不会起作用。