5

これは私の問題です: 私の言語 (ポルトガル語) は ISO-8859-1 文字エンコーディングを使用しています! 'coração' (ハート) のような文字列から文字にアクセスする場合は、次を使用します。

mb_internal_encoding('ISO-8859-1');
$str = "coração";

$len = mb_strlen($str,'UTF-8');

for($i=0;$i<$len;++$i)
    echo mb_substr($str, $i, 1, 'UTF-8')."<br/>";

これにより、次が生成されます。

c
o
r
a
ç
ã
o

これは正常に動作します...しかし、私の問題は、mb_substr関数の使用が単純な文字列の通常のアクセスほど速くない場合です! しかし、私はこれを行う簡単な方法が欲しい.... 通常の文字列文字アクセスのように: echo $str[$pos].... それは可能ですか?

4

3 に答える 3

4

mb_substr 関数は、通常の文字列文字アクセスのように [...] ほど高速ではありません: echo $str[$pos].... 可能ですか?

いいえ。

マルチバイト関数は、すべての文字をチェックして、それが占めるバイト数 (UTF-8 で 1 から 4) を判別する必要があります。$a[n]文字のインデックス付け ( ) が機能しない理由がすぐにわかります。n番目の文字を取得するために必要なバイトが、その文字より前のすべての文字を読み取る前にわかりません。

少しスピードアップするために、ここで答えを見ることができます:PHPでUTF-8文字列を反復する方法は?

mb_ただし、ISO 8859-1 または Latin-1 を使用しているため、そのエンコーディングではすべての文字が1 バイトでエンコードされるため、関数をまったく使用する必要はありません。

于 2012-05-02T11:24:05.510 に答える
1

試す:

preg_match_all( "/./u", $str, $ar_chars );
print_r( $ar_chars ); 
于 2012-05-02T11:34:18.627 に答える
0

... 並べ替え。固定幅エンコーディング (ISO 8859-*、UCS-2、または UTF-32、または BMP 内の UTF-16) を使用する場合は、文字アクセスに固定乗数を使用できます。ただし、複数バイトのエンコーディングに対して複数のアクセスを行う必要があります。

于 2012-04-28T05:10:40.130 に答える