Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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中的字符编码_Php_Unicode_Encoding_Utf 8_Iso 8859 1 - Fatal编程技术网

理解PHP中的字符编码

理解PHP中的字符编码,php,unicode,encoding,utf-8,iso-8859-1,Php,Unicode,Encoding,Utf 8,Iso 8859 1,我正在努力理解PHP中的字符编码 考虑以下脚本(您可以运行它): 我有一个字符串,实际上是欧元字符,用它的unicode代码点表示。在PHP5.5之前,使用的内部编码是ISO-8859-1,因此我认为我的字符串将使用此编码。使用unpack我可以看到字符串的bite表示,它对应于我用来定义字符串的十六进制代码 然后我使用mb\u convert\u encoding将字符串的编码转换为UTF-8。此时,字符串在屏幕上的显示方式不同,其字节表示也会发生变化(这是意料之中的) 如果我将PHP内部编码

我正在努力理解PHP中的字符编码

考虑以下脚本(您可以运行它):

我有一个字符串,实际上是欧元字符,用它的unicode代码点表示。在
PHP5.5
之前,使用的内部编码是
ISO-8859-1
,因此我认为我的字符串将使用此编码。使用
unpack
我可以看到字符串的bite表示,它对应于我用来定义字符串的十六进制代码

然后我使用
mb\u convert\u encoding
将字符串的编码转换为
UTF-8
。此时,字符串在屏幕上的显示方式不同,其字节表示也会发生变化(这是意料之中的)

如果我将
PHP
内部编码也更改为
UTF-8
,我希望
utf8string
能正确显示在屏幕上,但这不会发生


我缺少什么?

您显示的脚本没有使用任何非ascii字符,因此其内部编码没有任何区别
mb_internal_编码
会在输出时转换数据。会告诉你更多关于它是如何工作的;它也会告诉你最好不要使用它

代码中的三字节字符串
$string
是欧元符号的UTF-8表示形式,而不是其“unicode代码点”(与所有常见unicode字符一样,宽度为2字节:
0x20ac


这是否清除了您看到的行为?

您从一个字符串开始,该字符串是欧元符号的
utf-8
表示形式。如果运行
echo($string)
所有版本的PHP都会生成放入
$string
中的三个字节。浏览器对它们的解释方式取决于
内容类型
标题中指定的字符集。如果是
text/html;charset=utf-8
然后在呈现的页面中获得欧元符号

那你就错了。您只使用两个参数调用。这允许PHP使用第三个参数(
$from_encoding
)的
mb_字符串扩展所使用的内部编码的当前值。为什么?

对于PHP5.6及更新版本,返回的默认值是
utf-8
,对
mb\u convert\u encoding()
的调用是不可操作的

但是对于早期版本的PHP,
mb_internal_encoding()
返回的默认值是
iso-8859-1
,它与字符串的编码不匹配。因此,
mb\u convert\u encoding()
$string
的字节解释为三个单独的字符,并使用
utf-8
的规则进行编码。结果显然是错误的


顺便说一句,如果您使用
'€'
初始化
$string
,则在所有PHP版本(甚至在PHP4、iirc上)上都会得到相同的输出。

您是否在浏览器中运行此功能?这将对字符编码做出自己的选择,您最好对有问题的字符进行实体转义。在
中添加
,以确保浏览器也希望使用UTF8。PHP中的所有字符串都被视为二进制字符串,并且
mb\u internal\u encoding()
实际上只影响其他
mb.*
函数的工作方式。您也不能在同一文档中同时输出ISO-8859和UTF8,并且无论生成输出的程序是什么,都不能期望任何正常的情况发生。
$string = "\xe2\x82\xac";

var_dump(mb_internal_encoding());
var_dump($string);
var_dump(unpack('C*', $string));
$utf8string = mb_convert_encoding($string, "UTF-8");
var_dump($utf8string);
var_dump(unpack('C*', $utf8string));

mb_internal_encoding("UTF-8");

var_dump($string);
var_dump($utf8string);