在 PHP 中解析多字节字符串
题
我想编写一个基于状态机的(HTML)解析器,但我怀疑如何实际读取/使用输入。我决定将整个输入加载到一个字符串中,然后像处理数组一样使用它,并将其索引保留为当前解析位置。
单字节编码不会有问题,但在多字节编码中每个值并不代表一个字符,而是代表一个字符的一个字节。
例子:
$mb_string = 'žščř'; //4 multi-byte characters in UTF-8
for($i=0; $i < 4; $i++)
{
echo $mb_string[$i], PHP_EOL;
}
输出:
Ĺ
ž
Ĺ
Ą
这意味着我无法在循环中迭代字符串来检查单个字符,因为我永远不知道我是否位于字符的中间。
所以问题是:
- 如何以表演友好的方式从字符串中读取单个角色的多字节安全?
- 在这种情况下,与字符串一起工作是个好主意吗?
- 您将如何读取输入?
解决方案
http://php.net/mb_string 就是你要找的东西
- 只是 mb_substr 字符一一对应
- 直到 PHP6
- 到底是什么输入?一般情况下常用的方式
其他提示
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/>");
}
在不使用 mdb_latedFunctions 和多字节编码字符串的情况下,您可以使用标准子字符串函数来读取用于编码的多个字节。
例如,对于 UTF-8 编码(2 字节)字符串,如果您需要字符串中的第一个字符
$string = 'žščř'; //4 multi-byte characters in UTF-8
您必须获取 $string[0] 和 $string[1] 值,因此您实际上正在查找索引 0 和 1 之间的子字符串(对于第一个字符)。
请注意,$string[0] 或 $string[N] 将引用多字节字符串的第一个(或多字节字符串)
问候,
不隶属于 StackOverflow