在PHP中解析多字节字符串

Pet*_*ler 6 php string parsing multibyte

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

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

例:

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

for($i=0; $i < 4; $i++)
{
   echo $mb_string[$i], PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

输出:

?
ž
?
?
Run Code Online (Sandbox Code Playgroud)

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

所以问题是:

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

You*_*nse 2

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

  • 只是 mb_substr 字符一一对应
  • 直到 PHP6
  • 到底是什么输入?一般情况下常用的方式

  • 请注意,“mb_split”的注释部分包含许多如何将多字节字符串分解为字符数组的示例 - 例如,http://us2.php.net/manual/en/function.mb-split。 php#80046 (2认同)