%u → UTF-8
Столкнулся сегодня с задачей — надо сконвертировать пришедшую из JavaScript строку (в ней символы Юникода в виде «%uXXXX») в UTF-8 на PHP. Придумал, на мой взгляд, самый короткий способ это сделать:
echo json_decode(str_replace('%u', '\\u', json_encode($str_from_javascript)));
Красиво.
Спасибо, схоронил.
Можно еще так:
$s = «\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432!»;
$s = preg_replace(’/\\\u0([0-9a-fA-F]{3})/’,’\1;’,$s);
$s = html_entity_decode($s, ENT_NOQUOTES,’UTF-8’);
Комментарий для http://205k.in:
Можно, да, но тут регулярки, это всё-таки помедленнее должно быть.
с json способ весьма шустрый получается, кстати.
Комментарий для profiles.google.com/gaius.julius:
Думаю, можно ещё ускорить. Я перестраховался и сделал json_encode, можно без него (только обернуть строку в кавычки), если принять, что строка приходит в «безопасном» формате (то есть не содержит кавычек и всяких символов, которые могут не понравится json_decode).
Если будет мешанина из %uXXXX и %XX, то ваш способ не надёжен.
UTF8::unescape():
http://code.google.com/p/php5-utf8/source/browse/UTF8.php#3643
Комментарий для rin-nas.moikrug.ru:
А почему он ненадёжен?
<pre>
<?php
$s = ’«%u0025%u0032%u0035+%25%75%30%30%32%35»’;
include ’C:\www\adv\class\ReflectionTypeHint.php’;
include ’C:\www\adv\class\UTF8.php’;
echo json_decode(str_replace(’%u’, ’\\u’, json_encode(urldecode($s)))); //«%25 %»
echo PHP_EOL;
echo urldecode(json_decode(str_replace(’%u’, ’\\u’, json_encode($s)))); //«% %u0025»
echo PHP_EOL;
echo UTF8::unescape($s); //«%25 %u0025»
echo PHP_EOL;
Комментарий для rin-nas.moikrug.ru:
Мой код с этой строкой выдаёт следующее: «%25+%25%75%30%30%32%35». Всё правильно, %XX не декодится (я не обещал).
UTF8::unescape($s) выдаёт результат (если речь у нас о полном декодировании) далёкий от JS, JS (в FF) выдаёт следующее: «%u0025%u0032%u0035+%u0025».
Комментарий для Евгения Степанищева:
Спасибо большое! Долго искал решение. А Ваш способ самый простой.