将十进制值转换为 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)));
我需要将十进制值转换成 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)));