【问题标题】:Why can't I use "%20" in a string?为什么我不能在字符串中使用“%20”?
【发布时间】:2014-11-22 19:52:42
【问题描述】:

我使用了我在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 问题,发现stringtypedefed 指向我正在使用的游戏SDK (CryEngine2) 中的内部CryString 类型。我现在使用std::string 来解决这个问题。

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

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

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

【问题讨论】:

  • 您需要"%20"(三个字符),而不是'%20'(一个字符)。而且由于它的长度与" " 的长度不匹配,所以简单地替换你现在正在做的类型是行不通的。
  • 请修正您的问题(和标题)以明确您是在谈论“%20”还是“20%”,您一直在它们之间切换。
  • @JonathanWakely 已修复。我不做太多网络编程,这表明!
  • “我使用 HTML POST 方法通过 PHP 脚本将游戏服务器的信息获取到数据库,因此变量中的任何空格都必须替换为 %20。” 等等……什么?!
  • @LightnessRacesinOrbit 已编辑。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    2.13.3 [lex.ccon] 说:

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-30
      • 2012-06-11
      • 2020-11-17
      • 2023-03-30
      • 2015-10-28
      • 2010-09-25
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多