Перевести 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,

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