Пишу, по большей части, про историю, свою жизнь и немного про программирование.

%u → UTF-8

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

echo json_decode(str_replace('%u', '\\u', json_encode($str_from_javascript)));
10 комментариев
Николай 2012

Красиво.
Спасибо, схоронил.

205k.in 2012

Можно еще так:

$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) 2012

Комментарий для http://205k.in:

Можно, да, но тут регулярки, это всё-таки помедленнее должно быть.

Alexey Burlakov (profiles.google.com/gaius.julius) 2012

с json способ весьма шустрый получается, кстати.

Евгений Степанищев (bolknote.ru) 2012

Комментарий для profiles.google.com/gaius.julius:

Думаю, можно ещё ускорить. Я перестраховался и сделал json_encode, можно без него (только обернуть строку в кавычки), если принять, что строка приходит в «безопасном» формате (то есть не содержит кавычек и всяких символов, которые могут не понравится json_decode).

rin-nas (rin-nas.moikrug.ru) 2012

Если будет мешанина из %uXXXX и %XX, то ваш способ не надёжен.
UTF8::unescape():
http://code.google.com/p/php5-utf8/source/browse/UTF8.php#3643

Евгений Степанищев (bolknote.ru) 2012

Комментарий для rin-nas.moikrug.ru:

А почему он ненадёжен?

rin-nas (rin-nas.moikrug.ru) 2012

<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;

Евгений Степанищев (bolknote.ru) 2012

Комментарий для rin-nas.moikrug.ru:

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

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

ravector.com 2015

Комментарий для Евгения Степанищева:

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