在PHP中解析多字节字符串

时间:2010-04-07 08:36:23

标签: 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;
}

输出:

Ĺ
ž
Ĺ
Ą

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

所以问题是:

  • 如何多字节安全读取a 一个字符串中的单个字符 表现友好的方式?
  • 与...合作是个好主意 字符串,因为它是一个数组 情况?
  • 您如何阅读输入?

3 个答案:

答案 0 :(得分:2)

http://php.net/mb_string是您正在寻找的东西

  • 只是mb_substr字符一个接一个
  • 直到PHP6
  • 究竟输入了什么?一般的通常方式

答案 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个字节)

的问候,