Перевести URLENCODED данные в UTF-8 в PHP
У меня есть строка, которая находится в моей базе данных, как 中华武魂
когда я публикую свой запрос на получение данных через мой веб-сайт, я получаю данные на сервер в формате %E4%B8%AD%E5%8D%8E%E6%AD%A6%E9%AD%82
Какие шаги по расшифровке я должен предпринять, чтобы вернуть его в пригодную для использования форму? Кроме того, очищая ввод данных пользователем, чтобы убедиться, что они не будут пытаться атаковать инъекцией SQL? (escape-строка до или после кодирования?)
РЕДАКТИРОВАТЬ:
rawurldecode(); // returns "ä¸åŽæ¦é‚"
urldecode(); // returns "ä¸åŽæ¦é‚"
public function utf8_urldecode($str) {
$str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($str));
return html_entity_decode($str,null,'UTF-8');
}
// returns "ä¸åŽæ¦é‚"
... который на самом деле работает, когда я пытаюсь использовать его в выражении SQL.
Я думаю, потому что я делал echo
а также die();
без указания заголовка UTF-8 (таким образом, я предполагаю, что это читалось как латиница)
Спасибо за помощь!
2 ответа
Когда ваши данные на самом деле в такой процентной форме, вам просто нужно позвонить rawurldecode
:
$data = '%E4%B8%AD%E5%8D%8E%E6%AD%A6%E9%AD%82';
$str = rawurldecode($data);
Этого достаточно, поскольку данные уже закодированы в UTF-8: 中
(U + 4E2D) кодируется с помощью последовательности байтов 0xE4B8AD в UTF-8 и кодируется с помощью %E4%B8%AD
при использовании процентного кодирования.
То, что ваши выходные данные выглядят не так, как ожидалось, возможно, потому что выходные данные интерпретируются с неверной кодировкой символов, вероятно, Windows-1252 вместо UTF-8. Потому что в Windows-1252 0xE4 представляет ä
0xB8 представляет ¸
0xAD представляет å
, и так далее. Поэтому убедитесь, что вы правильно указали кодировку выходного символа.
Используйте URL-адрес PHP: http://php.net/manual/en/function.urldecode.php
У вас есть выбор здесь: urldecode
или же rawurldecode
,
Если вы закодировали свою строку, используя urlencode
, вы должны использовать urldecode
из-за способа обработки пробелов. В то время как urlencode
преобразует пробелы в +
, это не то же самое с rawurlencode
,