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

lea*_*eed 4 php unicode unicode-escapes

我有这个Unicode序列:\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059.如何将其转换为文本?

$unicode = '\u304a\u306f\u3088\u3046\u3054\u3056\u3044\u307e\u3059';
Run Code Online (Sandbox Code Playgroud)

我试过了:

echo $utf8-decode(unicode);
Run Code Online (Sandbox Code Playgroud)

我试过了:

echo mb_convert_encoding($unicode , 'US-ASCII', 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

我试过了:

echo htmlentities($unicode , ENT_COMPAT, "UTF-8");
Run Code Online (Sandbox Code Playgroud)

但这些函数都不会将序列转换为相应的日文文本.

ark*_*cha 5

这里的问题是字符串不是 unicode.它是一个转义序列,用于通过ASCII字符记下unicode(因此7位保存).

有一个简单的技巧来使用phps json解码器:

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

输出是:

Array
(
    [0] => ?????????
)
Run Code Online (Sandbox Code Playgroud)

这意味着您可以定义一个简单的便利功能:

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

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

echo decode($sequence);
Run Code Online (Sandbox Code Playgroud)

您希望在有效负载内添加错误处理和转义json特定控制字符.这个简单的例子只是为了指出你正确的方向......

玩得开心!


jul*_*ulp 5

来自 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) "?????????"
Run Code Online (Sandbox Code Playgroud)