Почему я не могу использовать "%20" в строке?

Я использую функцию, найденную в этом вопросе, адаптированную для замены всех пробелов на "%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Эд указывает на внутренний CryString введите в игре SDK, который я использую (CryEngine2). Я сейчас пользуюсь std::string чтобы противостоять этому.

Эта проблема также отражена в базе данных, которую я использую, после того, как произойдет преобразование и данные будут отправлены в базу данных:

Почему я не могу использовать %20 (и, возможно, другие символы кодирования URL) таким образом, и как я могу заставить это работать? Я попытался провести некоторое исследование по этому вопросу, чтобы решить проблему самостоятельно, но, тем не менее, ничего подходящего не произошло.

Я пытался использовать *it = (char)"%20"; на месте *it = (char)"%20";, но это на самом деле удаляет 0 который появляется в строке вместо замены пробелов %20,

2 ответа

Потому что язык C++ ничего не знает ни о какой "кодировке URL". С точки зрения языка С ++ ваш '%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;

Хотя при некотором тщательном программировании это можно сделать прямо в исходной строке.

Я пытался использовать *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 никогда не будет работать.

Другие вопросы по тегам