6

我想编写一个基于状态机的(HTML)解析器,但我怀疑如何实际读取/使用输入。我决定将整个输入加载到一个字符串中,然后像处理数组一样使用它,并将其索引作为当前解析位置。

单字节编码不会有问题,但在多字节编码中,每个值不代表一个字符,而是一个字符的一个字节。

例子:

$mb_string = 'žščř'; //4 multi-byte characters in UTF-8

for($i=0; $i < 4; $i++)
{
   echo $mb_string[$i], PHP_EOL;
}

输出:

Ĺ
ž
Ĺ
Ą

这意味着我不能在循环中遍历字符串来检查单个字符,因为我永远不知道我是否在一个字符的中间。

所以问题是:

  • 如何以性能友好的方式多字节安全地从字符串中读取单个字符?
  • 在这种情况下,使用字符串是一个数组是个好主意吗?
  • 你将如何阅读输入?
4

3 回答 3

2

http://php.net/mb_string是你要找的东西

  • 只是 mb_substr 字符一个一个
  • 直到 PHP6
  • 究竟是什么输入?一般的常规方式
于 2010-04-07T08:40:22.040 回答
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/>");
}
于 2010-04-07T08:44:15.373 回答
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 个字节)

问候,

于 2010-04-07T10:47:17.103 回答