将十进制值转换为 php 中的 unicode 字符

convert decimal value to unicode characters in php

我需要将十进制值转换成 unicode 并在 PHP 中显示 unicode 字符。

例如,602 将显示为这个字符:ɚ

referencing this SO question/answer 之后,我能够将其拼凑起来:

echo  json_decode('"' . '\u0' . dechex(602) . '"' );

这看起来很容易出错。有更好的方法吗?

我无法让 utf8_encode 工作,因为它似乎想以字符串而不是小数开头。

编辑:为了处理 230 到 250 之间的字符,需要 double 前缀零:

 echo   json_decode('"' . '\u00' . dechex(240) . '"' );  // ð
 echo   json_decode('"' . '\u00' . dechex(248) . '"' );  // ø
 echo   json_decode('"' . '\u00' . dechex(230) . '"' );  // æ

在某些情况下,不需要零:

echo json_decode('"' . '\u' . dechex(8592) . '"' );  // ←

这看起来很奇怪。

通常,当我试图回答我自己的问题时,一些 SO 向导会出现并向我展示一个我应该知道的内置函数。但在那之前,这就是我能想到的:

 $leading_zeros = null;

 if  ( strlen(strval(dechex($val))) >= 4 )       {
     $leading_zeros = '';
 } else if  ( ctype_alpha(dechex($val)[0]) )     {
     $leading_zeros = '00';
 } else if  ( ctype_digit(dechex($val)[0]) )     {
     $leading_zeros = '0';
 }
 echo json_decode('"' . '\u' . $leading_zeros . dechex($val) . '"' );

编辑:当尝试为 javaScript 做类似的事情时,文档告诉我格式应该看起来像 "\u####' 四位数。我不知道这是否类似于 PHP与否。

虽然通常要避免eval,但似乎严格控制在这里就可以了。

echo eval(sprintf('return "\u{%x}";',$val));
 echo json_decode(sprintf('"\u%04x"',$val));

这最终对我有用,但如果没有 Niet the Dark Absol[=11= 的回答,我不会找到这个]

如果您有 IntlChar 可用,我建议您使用 IntlChar::chr:

var_dump(IntlChar::chr(602));

否则,像下面这样的东西可以避免任何 eval/json_decode 欺骗:

var_dump(iconv('UTF-32BE', 'UTF-8', pack('N', 602)));