【PHP】OS 経由でコードポイントと文字の相互変換

2023/10/14に公開

proc_open 経由で OS コマンドでコードポイントから文字を生成してみた。PHP 7.4 からコマンドを配列で受け取れるようになった。

$c = sprintf('\\u%x', 0x3042);
$cmd = ['printf', '%b', $c];
$cmd2 = 'printf 🐶 | uconv -x "Any-Hex/Unicode"';

echo prop_exec($cmd), PHP_EOL;
echo prop_exec($cmd2), PHP_EOL;

function prop_exec($cmd) {
    $descriptorspec = [
        0 => ['pipe', 'r'],
        1 => ['pipe', 'w']
    ];
    $process = proc_open($cmd, $descriptorspec, $pipes);
    return stream_get_contents($pipes[1]);
    proc_close($process);
}

Debian で uconv を導入するには icu-devtools パッケージを導入すればよい。

sudo apt install icu-devtools 

shell_exec を使ってコードポイントを求めることもできる。

$cmd = 'printf 🐶 | uconv -x "Any-Hex/Unicode"';
echo shell_exec("($cmd)"),PHP_EOL;

OS コマンドを利用せずに eval でコードポイントから文字を生成することもできる。

$c = sprintf('\\u{%x}', 0x3042);
$cmd = 'echo "' . $c . '";';

ob_start();
eval($cmd);
$ret = ob_get_clean();
echo $ret, PHP_EOL;

Discussion