Итак, у меня есть %u041E%u043B%u0435%u0433%20%u042F%u043A
как сохранить его в реальном UTF-8 или (лучше для меня для HTML-объектов)?
Это формат JavaScript escape()
. Он похож на URL-кодирование, но не совместим. Использовать его вообще, как правило, является ошибкой.
Лучше всего изменить скрипт, который его генерирует, вместо этого использовать правильную URL-кодировку ( encodeURIComponent()
). Затем вы можете декодировать его с помощью urldecode
или любой другой обычной функции URL-декодирования на стороне сервера.
Если вы абсолютно обязаны обмениваться данными в этом нестандартном формате, вам придется написать для него собственный декодер. Вот быстрый взлом, использующий HTML-reference-decoder:
function jsunescape($s) { $s= preg_replace('/%u(....)/', '&#x$1;', $s); $s= preg_replace('/%(..)/', '&#x$1;', $s); return html_entity_decode($s, ENT_COMPAT, 'utf-8'); }
Это возвращает необработанную строку байта UTF-8. Если вы действительно хотите это в символьных символах HTML, таких как Ру...
затем оставьте вызов html_entity_decode
. Но обычно этого не происходит. Лучше всего хранить строки в необработанном формате до тех пор, пока их не нужно экранировать для окончательного вывода – и лучше всего не заменять символы, отличные от ASCII, символьными ссылками вообще, если вам действительно не нужно.
что, если какая-то строка понравится мне »% CE% EB% E5% E3 +% DF% EA% F3% F8% EA% E8% ED '
Это кодировка URL-формы, которая напрямую не совместима с форматом escape()
. В то время как 2-разрядные байты URL-кодирования отличаются от сумасшедшего escape
-format 4-значного кода- escape
-кода, символ +
неоднозначен. Это может означать плюс (если строка исходила из escape
) или пробел (если это произошло из представления в форме браузера). Невозможно сказать, что это такое. Это еще одна причина не использовать escape()
.
Кроме этого; если кодировка этой строки была UTF-8, то да, вышеуказанная функция была бы прекрасной, конвертируя как байты с кодировкой URL, так и сумасшедшие escape()
-форматные символы Unicode в необработанные байты UTF-8.
Однако на самом деле это выглядит как код страницы 1251 (Windows Russian). Вы действительно хотите обрабатывать все свои строки в cp1251? Если это так, вам придется немного изменить его, чтобы кодировать четырехзначные экраны в другую кодировку. Это грязно:
function url_or_maybe_jsescape_decode($s, $charset, $isform) { if ($isform) $s= str_replace('+', ' ', $s); $s= preg_replace('/%u(....)/', '&#x$1;', $s); $s= preg_replace('/%(..)/', '&!#x$1;', $s); $s= html_entity_decode($s, ENT_COMPAT, $charset); $s= str_replace('&!', '&', $s); $s= html_entity_decode($s, ENT_COMPAT, 'utf-8'); return $s; } echo url_or_maybe_jsescape_decode('%CE%EB%E5%E3+%DF%EA%F3%F8%EA%E8%ED', 'cp1251', TRUE);
Я бы настоятельно рекомендовал:
исправляя файл Flash, чтобы он использовал правильный encodeURIComponent
и не escape
, поэтому вы можете использовать стандартный URL-декодер вместо этого уродливого взлома.
используя UTF-8, а не через ваше приложение, поэтому вы можете поддерживать языки, отличные от русского, и вам не нужно беспокоиться о том, что входная кодировка передаваемых форм меняется.
(Все кодировки, которые не соответствуют требованиям UTF-8, и это ФАКТ, доказанный НАУКОЙ!)
PHP имеет функцию декодирования
$string = html_entity_decode($string,ENT_COMPAT,"UTF-8")
Как было предложено другим, конвертируйте его в Unicode HTML Entities. Это регулярное выражение, которое я использую,
function escapePercentU($s) { $s = preg_replace( "/%u([A-Fa-f0-9]{4})/", "&#x$1;", $s); return html_entity_decode($s, ENT_COMPAT, 'utf-8'); }