6

ステート マシンに基づいて (HTML) パーサーを作成したいのですが、実際に入力を読み取ったり使用したりする方法に疑問があります。入力全体を 1 つの文字列にロードし、それを配列と同様に操作し、そのインデックスを現在の解析位置として保持することにしました。

シングルバイト エンコーディングでは問題はありませんが、マルチバイト エンコーディングでは、各値は文字ではなく文字のバイトを表します。

例:

$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 is the thing you're looking for

  • just mb_substr characters one by one
  • not until PHP6
  • what input exactly? The usual way in general
于 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] と $string[1] の値を取得する必要があるため、実際にはインデックス 0 と 1 の間の部分文字列 (最初の文字) を探しています。

$string[0] または $string[N] は、最初の (またはマルチバイト文字列の N 番目のバイト) を参照することに注意してください。

よろしく、

于 2010-04-07T10:47:17.103 に答える