理解PHP中的字符编码
我正在努力理解PHP中的字符编码 考虑以下脚本(您可以运行它): 我有一个字符串,实际上是欧元字符,用它的unicode代码点表示。在理解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内部编码
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);