PHP库缺少mb_ord()
函数......也就是说,ord()函数执行的操作,但对于UTF8(或“mb”多字节,所以“mb_ord”)。我使用了here,
$ord = hexdec( bin2hex($utf8char) ); //decimal
我认为mb_substr($text, $i, 1, 'UTF-8')
得到“1 utf8-char”......但$ ord不会返回我们期望的值。
此代码不起作用:不显示像177(plusmn)的代码。
$msg = '';
$text = "... a UTF-8 long text... Ą ⨌ 2.5±0.1; 0.5±0.2 ...";
$allOrds = array();
for($i=0; $i<mb_strlen($text, 'UTF-8'); $i++) {
$utf8char = mb_substr($text, $i, 1, 'UTF-8'); // 1=1 unicode character?
$ord = hexdec( bin2hex($utf8char) ); //decimal
if ($ord>126) { //non-ASCII
if (isset($allOrds[$ord])) $allOrds[$ord]++; else $allOrds[$ord]=1;
}
}
foreach($allOrds as $o=>$n)
$msg.="\n entity #$o occurs $n times";
echo $msg;
输出
entity #50308 occurs 1 times
entity #14854284 occurs 1 times
entity #49841 occurs 2 times
所以(见entities table),49841不是177,而14854284(iiiint)不是10764。
答案 0 :(得分:1)
执行ord()函数的操作,但适用于UTF8
为此,您首先需要确定究竟是什么。 ord
为您提供字节的数值。这经常被混淆为“角色的价值”,但由于编码是一个复杂的话题,没有任何意义。所以,ord
==一个字节的数值。你期望“ord
的MB版本到底能做什么?
无论如何,你得到的是两个(或更多)字节的数值。比如,UTF-8中的字符“汉”被编码为三个字节E6 BC A2
。这就是bin2hex
给你的东西。 hexdec
然后将其转换为十进制,这是一个非常大的数字。这个数字与 Unicode代码点 6F22完全无关,你真正追求它。这是因为UTF-8编码需要更多的额外字节来编码这个代码点,因此U + 6F22(汉)不会转换为字节6F 22
。
您已经链接到另一个可以满足您需求的问题:
list(, $ord) = unpack('N', mb_convert_encoding($utf8Character, 'UCS-4BE', 'UTF-8'));
这基本上使用相同的逻辑,但它基于UCS-4编码,其中代码点碰巧很好地对应于字节。