%u → UTF-8

Столкнулся сегодня с задачей — надо сконвертировать пришедшую из JavaScript строку (в ней символы Юникода в виде «%uXXXX») в UTF-8 на PHP. Придумал, на мой взгляд, самый короткий способ это сделать:
echo json_decode(str_replace('%u', '\\u', json_encode($str_from_javascript)));
3 февраля 2012 10:57

Николай (инкогнито)
3 февраля 2012, 11:26

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

http://205k.in (инкогнито)
3 февраля 2012, 13:56

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

$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');

bolk (bolknote.ru)
3 февраля 2012, 14:19, ответ предназначен http://205k.in

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

Alexey Burlakov (profiles.google.com/gaius.julius)
3 февраля 2012, 21:06

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

bolk (bolknote.ru)
3 февраля 2012, 21:29, ответ предназначен profiles.google.com/gaius.julius:

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

rin-nas (rin-nas.moikrug.ru)
21 февраля 2012, 13:19

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

bolk (bolknote.ru)
21 февраля 2012, 18:41, ответ предназначен rin-nas (rin-nas.moikrug.ru):

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

rin-nas (rin-nas.moikrug.ru)
22 февраля 2012, 15:00

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

bolk (bolknote.ru)
22 февраля 2012, 19:17, ответ предназначен rin-nas (rin-nas.moikrug.ru):

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

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

ravector.com (инкогнито)
12 марта 2015, 21:13, ответ предназначен bolk (bolknote.ru):

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)