Как мне преобразовать escape-последовательности Unicode в текст на PHP?

У меня есть эта последовательность Unicode: \u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059, Как я могу преобразовать это в текст?

$unicode = '\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059';

Я старался:

echo $utf8-decode(unicode);

и я попробовал:

echo mb_convert_encoding($unicode , 'US-ASCII', 'UTF-8');

и я попробовал:

echo htmlentities($unicode , ENT_COMPAT, "UTF-8");

но ни одна из этих функций не преобразует последовательность в соответствующий текст на японском языке.

4 ответа

Проблема здесь в том, что строка не является Unicode. Это escape-последовательность, используемая для записи Юникода с помощью символов ASCII (т.е. 7-битное сохранение).

Для этого есть простой трюк с использованием jps-декодера phps:

<?php
$sequence = '\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059';
print_r(json_decode('["'.$sequence.'"]'));

Выход:

Array
(
    [0] => おはようございます
)

Это означает, что вы можете определить простую вспомогательную функцию:

<?php
$sequence = '\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059';

function decode($payload) {
  return array_pop(json_decode('["'.$payload.'"]'));
}

echo decode($sequence);

Вы хотите добавить обработку ошибок и экранирование специфических для json управляющих символов внутри полезной нагрузки. Этот простой пример предназначен для того, чтобы указать вам правильное направление...

Повеселись!

Класс транслитератора из расширения intl может обрабатывать преобразование с его предопределенным идентификатором Hex-Any:

$in = '\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059';
$out = transliterator_create('Hex-Any')->transliterate($in);
var_dump($out); # string(27) "おはようございます"
$unicode = '\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059';
$json = sprintf('"%s"',$unicode); # build json string

$utf8_str = json_decode ( $json, true ); # json decode
echo $utf8_str; # おはようございます

Смотри строку Json

PHP 7+

Начиная с PHP 7, вы можете использовать синтаксис escape-кода Unicode для этого.

echo "\u{304a}\u{306f}\u{3088}\u{3046}\u{3054}\u{3056}\u{3044}\u{307e}\u{3059}"; выходы おはようございます,

Другие вопросы по тегам