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"); ?>
ア
还有pack
function,但你可以期望它很慢。
html_entity_decode('エ', 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 。