-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、出力は次のようになります。

ここに画像の説明を入力

私の最後の質問は問題を扱っており、私が使用しているゲーム SDK (CryEngine2)の内部型を指していることがstringわかりました。私はこれに対抗するために現在使用しています。stringtypedefCryStringstd::string

この問題は、この変換が発生してデータがデータベースに送信された後に使用するデータベースにも反映されます。

ここに画像の説明を入力

%20この方法で (おそらく他の URL エンコーディング記号も)使用できないのはなぜですか? また、これを機能させるにはどうすればよいですか? 自分で問題を解決するためにこれについて調査を試みましたが、関連するものは何もありませんでした。

*it = (char)"%20";の代わりにを使用してみまし*it = (char)"%20";たが、実際には0、スペースを に置き換えるのではなく、文字列に表示されている を削除します%20

4

2 に答える 2

10

C++ 言語は「URL エンコーディング」について何も知らないためです。C++ 言語の観点から言えば、 your'%20'は、型の実装定義の値を指定する複数char文字の定数です (複数文字の定数は、C および C++ 言語のあいまいな機能です)。

URL 対応の受信者に渡すために文字列で使用したい (または使用しなければならない) 場合"%20"は、"%20" を部分文字列 (3 文字) として文字列に挿入する必要があります。

文字列リテラルを文字型に変換しようとして"%20"も、何も達成されません。1 の場所に 3 の文字を詰め込むことはできません。文字列の末尾部分を「シフト」して、以前は 1 文字だった場所に 3 文字分のスペースを確保する必要があります。

状況によっては、別の文字列で新しい結果を生成する方が理にかなっている場合があります

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 に答える