<?php
$str ='如果';
var_dump($str[1]);
echo '<br />';
var_dump(ord($str[1]));
echo '<br />';
echo mb_substr($str , 1 , 1)
?>
这将输出如下内容:
string(1)“�”
int(166)
果
我想获取第二个字符果
,mb_substr
可以正确获取,而$ str [n]不起作用。完全可以使用$str[n]
处理utf-8字符吗?
答案 0 :(得分:4)
UTF-8使用多个字节来表示ASCII范围(U + 00000至U + 0007F)之外的Unicode字符。您的字符串如果
(U + 05982 U + 0679C)表示为六个字节:
0xE5 0xA6 0x82 0xE6 0x9E 0x9C
-------------- --------------
(U+05982) (U+0679C)
PHP本身不支持Unicode。它将所有字符串视为字节序列,而不是Unicode字符。因此,$str[1]
从此序列中提取第二个 byte (0xA6 = 166),而不是第二个 character 。这是一个连续字节,因此单独存在时无效,并显示为替换字符``。
请勿在UTF-8字符串上使用字符索引。为了获得正确的行为,必须使用mb_
函数。