如何在PHP中将Unicode转义序列转换为文本?

9
我有这个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个回答

12

问题在于该字符串并不是Unicode编码,而是通过ASCII字符(因此为7位)来记录Unicode的转义序列。

有一个简单的技巧可以使用PHP的JSON解码器来解决这个问题:

<?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特定的控制字符。这个简单的例子只是为了指引你朝着正确的方向前进...

玩得开心!


如果输入字符串中包含双引号,则此方法无法正常工作。 - Oleg
@Oleg,实际上在答案中提到了要在解决方案中添加错误处理和转义。 - arkascha

6

intl扩展中的Transliterator类可以使用其预定义的Hex-Any标识符来处理转换:

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

谢谢,你真是救星。我正在Laravel中转换字体,但是laravel只给了我unicode字体..你的方法帮了我很多。但需要安装php扩展。 - Pyae Sone

3
$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字符串

输入图像描述


2

PHP 7+

自 PHP 7 开始,您可以使用Unicode 码位转义语法来实现此功能。

echo "\u{304a}\u{306f}\u{3088}\u{3046}\u{3054}\u{3056}\u{3044}\u{307e}\u{3059}"; 输出 おはようございます


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接