根据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
为什么会这样?
答案 0 :(得分:5)
仅适用于2018年的 PHP v7.2.0 + 。
现在您可以使用mb_ord()。
示例echo mb_ord('€','UTF-8');
另请参阅mb_chr(),以获取十进制代码的UTF-8表示。
示例echo mb_chr(2048,'UTF-8');
。
最佳实践是通用的,将所有PHP脚本保存为UTF-8 (请参阅@deceze)。
答案 1 :(得分:4)
0xA4
)0x80
)0x20AC
)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函数返回字符串中第一个字符的十进制数。
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