我想编写一个基于状态机的(HTML)解析器,但我怀疑如何实际读取/使用输入。我决定将整个输入加载到一个字符串中,然后像使用数组一样处理它并将其索引保持为当前解析位置。
单字节编码没有问题,但在多字节编码中,每个值都不代表字符,而是字符的字节。
示例:
$mb_string = 'žščř'; //4 multi-byte characters in UTF-8
for($i=0; $i < 4; $i++)
{
echo $mb_string[$i], PHP_EOL;
}
输出:
Ĺ
ž
Ĺ
Ą
这意味着我不能在循环中遍历字符串以检查单个字符,因为我永远不知道我是否在角色的中间。
所以问题是:
答案 0 :(得分:2)
http://php.net/mb_string是您正在寻找的东西
答案 1 :(得分:1)
mb_internal_encoding("UTF-8");
$mb_string = 'žščř';
$l=mb_strlen($mb_string);
for($i=0;$i<$l;$i++){
print(mb_substr($mb_string,$i,1)."<br/>");
}
答案 2 :(得分:0)
不使用mdb_relatedFunctions和多字节编码字符串,您可以使用标准子字符串函数,这些函数读取用于编码的字节的倍数。
例如,对于UTF-8编码(2字节)字符串,如果您需要字符串中的第一个字符
$string = 'žščř'; //4 multi-byte characters in UTF-8
你必须得到$ string [0] AND $ string [1]的值,所以你实际上是在寻找索引0和1之间的子串(对于第一个字符)。
请注意$ string [0]或$ string [N]将引用第一个(或多字节字符串的第N个字节)
的问候,