Поэтому я отправляю сообщение с одной переменной, это закодированная в base64 строка, которая является UrlEncoded.
Когда я отправляю строку поверх отладчика сети Firefox, она работает нормально. Мне даже не нужен urldecode при использовании Firefox debugger, это делается автоматически.
НО, когда я отправляю его из моего приложения C++, он вообще не декодируется.
Строка - строка Юникода, мое C++ приложение - все Unicode.
У меня есть header("Content-Type: text/html; charset=UTF-8");
в верхней части моей страницы php, чтобы убедиться.
Приложение php повторяет ответ обратно в приложение C++.
if($encData = input::get('x')){
echo $encData;
}
Я получаю свой ответ, но его не расшифровывают. Даже если я использую urldecode()
или rawurldecode()
Спасибо за любую помощь :)
Unicode - это не одно. Unicode относится как к стандарту Unicode (блоки символов, которые связаны с блоками кодовых точек), так и к нескольким кодировкам, которые представляют собой кодовые точки для вашего текста.
Существует несколько типов строк. Например, в Windows есть строки "ASCII" и "Wide", поэтому суффиксы A и W для функций WinAPI. "ASCII" относится к тому факту, что он использует 8-битный char
в строке, а "Wide" ссылается (в Windows) на использование 16-разрядных short
s для каждого символа в строке. (Другие платформы, такие как Linux, стандартизированы для использования 32-разрядных символов для широких строк).
Представленный вами пример кода показывает, что вы используете широкие строки и отправляете их по ссылке. Стандартные 16-битные строки Windows обычно используют кодировку Unicode UCS-2 (которая очень похожа на UTF-16, но не то же самое, что и UTF-16), тогда как PHP и стандарт HTTP ожидают 8-битных символов, а по умолчанию, PHP ожидает строки UTF-8. Это видно в дампе данных, который вы предоставили, поскольку он показывает NUL байты между каждым 8-битным символом. (Это то, что выглядит UCS-2 при отправке текста Latin-1).
Поскольку PHP ожидает UTF-8, и вы отправляете его UCS-2, PHP не может понять текст, поэтому его функция urldecode
ничего не может с этим поделать.
Перед отправкой вам нужно будет преобразовать вашу строку в 8-битную кодировку.