Почему я не могу использовать "%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
никогда не будет работать.