-2

我使用了我在这个问题中找到的一个函数,适用于用“%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指向typedefCryString正在使用的游戏 SDK 中的内部类型(CryEngine2)。我现在正在使用std::string以应对这种情况。

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

在此处输入图像描述

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

我尝试过使用*it = (char)"%20";.*it = (char)"%20";0%20

4

2 回答 2

10

因为 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;

尽管通过一些仔细的编程,可以直接在原始字符串中进行。

于 2014-11-22T19:55:34.220 回答
5

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

请不要将古怪的 PHP 习惯应用于 C++,你不能只说“假装这个字符串是单个字符”并期望任何明智的事情。"%20"是一个数组,将其转换为char获取第一个元素的地址(这是一个 32 位或 64 位指针值),然后将其截断为 a 的大小char,可能是 8 位,这会给你垃圾。

'%'是一个字符,并且'2'是一个字符,但'%20'不是一个字符,所以你不能明智地将它分配给 a char

(从技术上讲'%20',它是一个具有实现定义值的多字符常量,在我的编译器中是0x253230,这显然太大而无法容纳我的编译器的 8 位字符)

2.13.3 [lex.ccon] 说:

包含多个c-char的普通字符文字是多字符文字。多字符文字或包含无法在执行字符集中表示的单个c-char的普通字符文字是有条件的,具有 typeint并具有实现定义的值。

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

于 2014-11-22T20:07:25.587 回答