PHP Unicode代码点转字符

6
我想把Unicode码点转换成字符。以下是我的尝试过程:
$point = dechex(127468);  // 1f1ec

echo "\u{1f1ec}";         // this works
echo "\u{$point}";        // this outputs '\u1f1ec'
echo "\u{{$point}}";      // Parse error: Invalid UTF-8 codepoint escape sequence
echo "\u\{{$point}\}";    // outputs \u\{1f1ec\}
echo "\u{". $point ."}";  // Parse error; same as above

1
啊,好吧。如果没有可能的话,似乎这是一个失落的情况 :) 但下面的答案很有道理。 - IncredibleHat
4个回答

7

你不需要将整数转换为十六进制字符串,而是应该使用IntlChar::chr函数:

echo IntlChar::chr(127468);

直接从IntlChar::chr文档中翻译得到:

通过代码点值返回Unicode字符。


2
很酷。我得收藏这个,因为我肯定以后会遇到这个问题,然后会想,“那是什么来着?” :) - IncredibleHat

0

几个小时后终于找到了解决方案:

$unicode = '1F605'; //
$uni = '{' . $unicode; // First bracket needs to be separated, otherwise you get '\u1F605'

$str = "\u$uni}";

eval("\$str = \"$str\";"); // Turns unicode into RegEx and store it as $str
echo $str;

感谢 @Rick James 提供使用 eval() 函数的想法


0

PHP 7+ 解决方案片段:

function charFromCodePoint($codepoint) {
    eval('$ch = "\u{'.dechex($codepoint).'}";');
    return $ch;
}

请注意,PHP5不支持"\u{}"语法。

0
当你想要获取一个浮点数,比如说 12e-4,通过连接字符串的方式时,会出现类似的问题。编译器在解析时过早完成了这个操作,无法实现。不过,你可以使用 eval() 来实现。但是这种方法并不优雅。

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