Intereting Posts
Почему эта таблица нескольких строк отправляется по строке? Это верно? Заказ результатов запроса XPath PHP: упорядочить ассоциативный массив Какова таблица лидеров лучшей практики с php, mysql, memcached? Как автоматически преобразовать URL-адрес в гипер ссылку в PHP? PHP DomDocument изменяет условные комментарии Facebook PHP throwing exception "(# 803) Некоторые из запрошенных вами псевдонимов не существуют" Отключить все заголовки, добавленные в Apache Может ли имя файла PHP (или каталог полного пути) содержать символы UTF-8? Альтернатива множеству логических значений в MySQL? date_create_from_format эквивалент для PHP 5.2 (или ниже) Как я могу использовать поддельный sendmail с SwiftMailer в Windows? Создание временного каталога для распаковки zipfile в Как предотвратить множественные логины на веб-сайте PHP Публиковать поток из приложения – для не зарегистрированных пользователей, используя Graph API, php SDK

Как декодировать такую ​​странную строку в UTF-8? (PHP)

Итак, у меня есть %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); 

Я бы настоятельно рекомендовал:

  1. исправляя файл Flash, чтобы он использовал правильный encodeURIComponent и не escape , поэтому вы можете использовать стандартный URL-декодер вместо этого уродливого взлома.

  2. используя 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'); }