Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ord()不';不能使用utf-8_Php_Unicode_Ascii - Fatal编程技术网

Php ord()不';不能使用utf-8

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处有欧元符

根据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处有欧元符号(
    0x20AC
  • UTF-8将其编码为
    0xE2 0x82 0xAC
    。第一个字节
    E2
    是十进制的226
因此,您的源文件似乎是用UTF-8编码的(并且
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个八位字节
功能ord_utf8($s){
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