Php ord()不';不能使用utf-8
根据ISO 8859-1 欧元符号的十进制值为128 我的默认php脚本编码是Php ord()不';不能使用utf-8,php,unicode,ascii,Php,Unicode,Ascii,根据ISO 8859-1 欧元符号的十进制值为128 我的默认php脚本编码是 echo mb_internal_encoding(); //ISO-8859-1 那么现在作为PHP echo chr(128); //Output exactly what i want '€' 但是 为什么会这样?根据和 ISO-8859-1根本没有欧元符号 ISO-8859-15的代码点为164(0xA4) Windows-1252的代码点为128(0x80) Unicode在代码点8364处有欧元符
echo mb_internal_encoding(); //ISO-8859-1
那么现在作为PHP
echo chr(128); //Output exactly what i want '€'
但是
为什么会这样?根据和
- ISO-8859-1根本没有欧元符号
- ISO-8859-15的代码点为164(
)0xA4
- Windows-1252的代码点为128(
)0x80
- Unicode在代码点8364处有欧元符号(
)0x20AC
- UTF-8将其编码为
。第一个字节0xE2 0x82 0xAC
是十进制的226E2
ord()
只返回第一个字节),而您的输出是在Windows-1252中
php文件另存为UTF-8(将文件保存到磁盘时,在文本编辑器中将其另存为UTF-8)。其中的字符串文字包含字节e282 AC
;想象一下是这样的:
echo ord('\xE2\x82\xAC');
在十六进制编辑器中打开该文件,以获得真正的清晰性
ord
仅返回0-255范围内的单个整数。字符串文本包含三个字节,ord
需要返回三个整数,而不会返回。它只返回第一个,即226
在文本编辑器中以不同的编码保存文件,您将看到不同的结果。此PHP函数返回字符串中第一个字符的十进制数
- 如果数字小于128,则字符编码为1个八位字节
- 否则,如果该数字小于2048,则字符编码为2个八位字节
- 否则,如果数字小于65536,则字符编码为3个八位字节
- 否则,如果数字小于1114112,则字符编码为4个八位字节
return(int)($s=unpack($C*,$s[0].$s[1].$s[2].$s[3])&&$s[1]127&&$s[4]>127?(7&$s[1])仅适用于2018年的PHP v7.2.0+ mb_ord() 现在你可以用了。 示例
echo mb_ord('€','UTF-8');
另请参见,以获取十进制代码的UTF-8表示形式。示例
echo mb_chr(2048,'UTF-8');
最好的做法是通用,将所有PHP脚本保存为UTF-8(请参见@deceze)。您是否阅读了手册?其中有一些解释……是的,我已经阅读了第一个ord()函数对chr()的补充。您是否也阅读了@Naruto链接到的页面上的评论?尤其是第二个?它详细解释了为什么
ord()
不适用于utf-8:单字节编码,例如(7位)ASCII和ISO 8859系列,这将对应于第一个字符,并将是该字符在编码映射表中的位置。对于多字节编码,如UTF-8或UTF-16,字节可能不代表完整的字符
我的默认编码是echo mb_internal_encoding();//ISO-8859-1But chr()还支持单字节编码。为什么它输出128位十进制值的'€',我的源文件默认编码是echo mb_internal_encoding();//ISO-8859-1
@好奇该函数的返回值完全没有说明源代码文件的编码方式。@好奇:没有。8859-1甚至没有欧元符号。请阅读感谢您的回答。Genius我非常喜欢最新版本的PHP,这一添加也不例外
echo ord('€'); //opposite it returns 226, it should be 128
echo ord('\xE2\x82\xAC');
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
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