Я использую функцию, которую я нашел в этот вопрос, адаптировано для замены всех пробелов на «% 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
,
Потому что язык 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] говорит:
Обычный символьный литерал, содержащий более одного с-символ это многозначный буквальный. Мультихарактерлитеральный или обычный символьный литерал, содержащий один с-символ не представлен в наборе символов выполнения, условно поддерживается, имеет тип
int
и имеет значение, определяемое реализацией.
Есть несколько способов заменить отдельные символы на строки (ответ AndreyT показывает хороший простой подход), но просто пытаются разбить что-то, что не является char
в байт памяти, держащей один char
никогда не будет работать.