2013-01-08 71 views
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

貌似¡是一个多字节字符..你为什么想通过访问它' []'? –

+3

多字节字符串。 ''是两个字节的字符[00A1],这就是为什么第一个字节没有任何内容,第二个字节是垃圾。 – Sammitch

+3

@Peter这不是浏览器编码问题,通过[]或{}索引字符串不是多字节安全的。 – dualed

回答

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 
4

通过[]{}索引字符串不是多字节安全的。

使用多字节的功能,而不是像mb_substr