PHPstring中的Unicode字符

这个问题看起来很尴尬简单,但我一直无法find答案。

什么是相当于下面的C#代码行的PHP?

string str = "\u1000"; 

本示例创build一个string,其中包含一个Unicode字符,其“Unicode数值”为hex1000(十进制数4096)。

也就是说,在PHP中,我怎样才能创build一个string与一个Unicode字符的“Unicode数值”已知?

因为JSON直接支持\uxxxx语法,所以我想到的第一件事是:

 $unicodeChar = '\u1000'; echo json_decode('"'.$unicodeChar.'"'); 

另一个select是使用mb_convert_encoding()

 echo mb_convert_encoding('က', 'UTF-8', 'HTML-ENTITIES'); 

或者利用UTF-16BE(big endian)和Unicode码点之间的直接映射:

 echo mb_convert_encoding("\x10\x00", 'UTF-8', 'UTF-16BE'); 

PHP 7.0.0引入了“Unicode码点转义”语法 。

现在可以使用双引号或heredocstring轻松编写Unicode字符,而无需调用任何函数。

 $unicodeChar = "\u{1000}"; 

PHP不知道这些Unicode转义序列。 但是,由于未知的转义序列不受影响,您可以编写自己的函数来转换这种Unicode转义序列:

 function unicodeString($str, $encoding=null) { if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding'); return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', create_function('$match', 'return mb_convert_encoding(pack("H*", $match[1]), '.var_export($encoding, true).', "UTF-16BE");'), $str); } 

或者使用匿名函数expression式而不是create_function

 function unicodeString($str, $encoding=null) { if (is_null($encoding)) $encoding = ini_get('mbstring.internal_encoding'); return preg_replace_callback('/\\\\u([0-9a-fA-F]{4})/u', function($match) use ($encoding) { return mb_convert_encoding(pack('H*', $match[1]), $encoding, 'UTF-16BE'); }, $str); } 

其用法:

 $str = unicodeString("\u1000"); 

我想知道为什么没有人提到这一点,但你可以做一个几乎相同的版本使用双引号string中的转义序列:

\x[0-9A-Fa-f]{1,2}

与正则expression式匹配的字符序列是以hex表示的字符。

ASCII示例:

 <?php echo("\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x21"); ?> 

你好,世界!

所以对于你的情况,你需要做的只是$str = "\x30\xA2"; 。 但是这些是字节 ,而不是字符。 Unicode码点的字节表示符合UTF-16大端,所以我们可以直接打印出来:

 <?php header('content-type:text/html;charset=utf-16be'); echo("\x30\xA2"); ?> 

如果使用不同的编码,则需要相应地更改字节(主要是通过库来完成,尽pipe也可以手动完成)。

UTF-16小端例子:

 <?php header('content-type:text/html;charset=utf-16le'); echo("\xA2\x30"); ?> 

UTF-8示例:

 <?php header('content-type:text/html;charset=utf-8'); echo("\xE3\x82\xA2"); ?> 

还有packfunction,但你可以期望它很慢。

 html_entity_decode('&#x30a8;', 0, 'UTF-8'); 

这也起作用。 然而,json_decode()解决scheme要快得多(大约50次)。

试用便携式UTF-8 :

 $str = utf8_chr( 0x1000 ); $str = utf8_chr( '\u1000' ); $str = utf8_chr( 4096 ); 

所有的工作方式完全相同。 你可以用utf8_ord()获得一个字符的代码点。 阅读更多关于便携式UTF-8 。