ord()不适用于utf-8

时间:2016-02-23 11:01:23

标签: php unicode ascii

根据ISO 8859-1

€符号的小数值为128

我的默认php脚本编码是

echo mb_internal_encoding(); //ISO-8859-1

现在就像PHP

echo chr(128);  //Output exactly what i want '€'

但是

echo ord('€');  //opposite it returns 226, it should be 128

为什么会这样?

4 个答案:

答案 0 :(得分:5)

仅适用于2018年的 PHP v7.2.0 +

mb_ord()

现在您可以使用mb_ord()。 示例echo mb_ord('€','UTF-8');

另请参阅mb_chr(),以获取十进制代码的UTF-8表示。
示例echo mb_chr(2048,'UTF-8');

最佳实践是通用的,将所有PHP脚本保存为UTF-8 (请参阅@deceze)。

答案 1 :(得分:4)

根据WikipediaFileFormat

  • ISO-8859-1根本没有欧元符号
  • ISO-8859-15在代码点164(0xA4
  • 有它
  • Windows-1252在代码点128(0x80
  • 处拥有它
  • Unicode在代码点8364(0x20AC
  • 处具有欧元符号
  • UTF-8将其编码为0xE2 0x82 0xAC。第一个字节E2是十进制的226。

因此,您的源文件似乎以UTF-8编码(ord()仅返回第一个字节),而您的输出则在Windows-1252中。

答案 2 :(得分:2)

echo ord('€');  //opposite it returns 226, it should be 128

您的.php文件保存为UTF-8(将文件保存到磁盘时,将其保存为文本编辑器中的UTF-8)。其中的字符串文字包含字节E2 82 AC;可视化它是这样的:

echo ord('\xE2\x82\xAC');

在十六进制编辑器中打开文件,以确保清晰。

ord仅返回0到255范围内的单个整数。您的字符串文字包含三个字节,ord需要返回三个整数,它赢了。它只返回第一个,226

在文本编辑器中以不同的编码保存文件,您会看到不同的结果。

答案 3 :(得分:1)

此PHP函数返回字符串中第一个字符的十进制数。

  • 如果该数字低于 128 ,则该字符将以1个八位字节编码。
  • 如果该数字低于 2048 ,则该字符将以2个八位字节编码。
  • 如果该数字低于 65536 ,则该字符将以3个八位字节编码。
  • 如果该数字低于 1114112 ,则该字符将以4个八位字节编码。

function ord_utf8($s){
return (int) ($s=unpack('C*',$s[0].$s[1].$s[2].$s[3]))&&$s[1]<(1<<7)?$s[1]:
($s[1]>239&&$s[2]>127&&$s[3]>127&&$s[4]>127?(7&$s[1])<<18|(63&$s[2])<<12|(63&$s[3])<<6|63&$s[4]:
($s[1]>223&&$s[2]>127&&$s[3]>127?(15&$s[1])<<12|(63&$s[2])<<6|63&$s[3]:
($s[1]>193&&$s[2]>127?(31&$s[1])<<6|63&$s[2]:0)));
}

echo ord_utf8('€');

// Output 8364 then this character is encoded in 3 octets

您可以在https://eval.in/748181 ...

中查看结果

ord_utf8 函数是 chr_utf8 的倒数(从十进制数打印一个utf8字符)

function chr_utf8($n,$f='C*'){
return $n<(1<<7)?chr($n):($n<1<<11?pack($f,192|$n>>6,1<<7|191&$n):
($n<(1<<16)?pack($f,224|$n>>12,1<<7|63&$n>>6,1<<7|63&$n):
($n<(1<<20|1<<16)?pack($f,240|$n>>18,1<<7|63&$n>>12,1<<7|63&$n>>6,1<<7|63&$n):'')));
}

for($test=1;$test<1114111;$test++)
if (ord_utf8(chr_utf8($test))!==$test)
die('Error found');

echo 'No error';

// Output No error