使用字符'¡'时出现奇怪的字符串行为

4
请看这个:

请查看以下内容:

$str = '¡hola!'; // '¡' is the spanish opening exclamation mark

echo $str{0}; // prints nothing
echo $str{1}; // prints �
echo $str{2}; // prints h

这个php脚本采用UTF-8编码,我在apache模块或者CLI中执行都得到相同结果。PHP版本:5.4.6。

为什么我会得到奇怪的结果呢?


2
看起来 ¡ 是一个多字节字符..你为什么要通过 [] 来访问它? - Explosion Pills
3
多字节字符串。¡是一个由两个字节[00A1]组成的字符,这就是为什么第一个字节没有输出内容,第二个字节输出了垃圾字符。 - Sammitch
3
@Peter 这不是浏览器编码问题,使用 [] 或 {} 索引字符串不具备多字节安全性。 - dualed
2个回答

4

使用 []{} 来索引一个字符串不是多字节安全的。

应该使用多字节函数,比如 mb_substr


2
这是因为在UTF中,¡实际上是一个多字节字符,PHP无法通过数组访问([0])正确处理它。您需要查看多字节函数:http://php.net/manual/en/book.mbstring.php 这应该可以按照您的期望工作:
$str = '¡hola!';

echo mb_substr($str, 0, 1, 'UTF-8'); // prints ¡
echo mb_substr($str, 1, 1, 'UTF-8'); // prints h
echo mb_substr($str, 2, 1, 'UTF-8'); // prints o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接