%u → UTF-8

Столкнулся сегодня с задачей — надо сконвертировать пришедшую из JavaScript строку (в ней символы Юникода в виде «%uXXXX») в UTF-8 на PHP. Придумал, на мой взгляд, самый короткий способ это сделать:

echo json_decode(str_replace('%u', '\\u', json_encode($str_from_javascript)));

Комментарии 10

205k.in № 2
Можно еще так:

$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})/','&#x\1;',$s);
$s = html_entity_decode($s, ENT_NOQUOTES,'UTF-8');
Евгений Степанищев (bolknote.ru) автор № 3
Можно, да, но тут регулярки, это всё-таки помедленнее должно быть.
Alexey Burlakov (profiles.google.com/gaius.julius) № 4
с json способ весьма шустрый получается, кстати.
Евгений Степанищев (bolknote.ru) автор № 5
Думаю, можно ещё ускорить. Я перестраховался и сделал json_encode, можно без него (только обернуть строку в кавычки), если принять, что строка приходит в «безопасном» формате (то есть не содержит кавычек и всяких символов, которые могут не понравится json_decode).
Евгений Степанищев (bolknote.ru) автор № 9
Комментарий для rin-nas.moikrug.ru:

Мой код с этой строкой выдаёт следующее: «%25+%25%75%30%30%32%35». Всё правильно, %XX не декодится (я не обещал).

UTF8::unescape($s) выдаёт результат (если речь у нас о полном декодировании) далёкий от JS, JS (в FF) выдаёт следующее: «%u0025%u0032%u0035+%u0025».
ravector.com № 10
Комментарий для Евгения Степанищева:

Спасибо большое! Долго искал решение. А Ваш способ самый простой.