2

特別なアクセント文字 (ă など) を文字列内の a-zA-Z 文字に変換する次の関数があります。

function tradu($sir){

        $sir_aux = $sir;

        $diacritice = array("ă"=>"a", "â"=>"a", "î"=>"i", "Î"=>"I", "ș"=>"s", "ş"=>"s", "ţ"=>"t", "ț"=>"t");

        for($i=0; $i<strlen($sir_aux); $i++){

            foreach($diacritice as $key=>$value){
                if($sir_aux[$i]==$key)
                    $sir_aux[$i]=$value;
            }
        }

        $sir_aux = strtr($sir, $diacritice);

        return $sir_aux;
    }   

a が元の文字列で、a_translated が翻訳された文字列だとしましょう。

と を使用するstrpos(a, string_to_find)strpos(a_translated, string_to_find)、返される値が異なります。私もチェックstrlen(a)strlen(a_translate)ましたが、それらは異なる結果をもたらします。 なぜこうなった?

アクセント付きの文字列に特定の通常の文字列 (アクセントなし) が含まれているかどうかを検索する必要があるため、この説明が必要ですが、アクセントが含まれている場合でも、元の文字列から見つけた部分を返す必要があります。

私が試し たこと 元の文字列を翻訳し、searched_string の開始位置を見つけてから、 I substr(ORIGINAL_STRING, position). ここで、位置が一致していないことに気付きました。

例: 元の文字列: Universitatea a fost înființată în 2001 pentru a oferi... 検索された文字列: infiintata 目的の結果: înființată în 2001 pentru a oferi...

4

2 に答える 2

5

strpos元の文字列がマルチバイトであり、マルチバイト文字列を処理できないため、取得した位置は正しくありませstrposん。代わりにmb_strposを試してください。

試す:

mb_strpos(a,string_to_find,0,'UTF-8');

mb_strpos(a_translated,string_to_find,0,'UTF-8');

同じ結果になることがわかります。

このコードは、strpos (マルチバイト文字列を処理できない) と mb_strpos の違いを示しています。

$original_multibyte_string       = 'țată în  HERE';
$a_non_multibyte_str_same_length = '123456789HERE';
// HERE is on 10th (index 9 on array) character

echo 'strpos finds HERE in multibyte at: '.strpos($original_multibyte_string,'HERE').' '.'strpos finds HERE in non-multibyte at: '.strpos($a_non_multibyte_str_same_length,'HERE');
// OUTPUTS: strpos finds HERE in multibyte at: 12 strpos finds HERE in non-multibyte at: 9

echo "\n";
// now lets test the multibyte:

echo 'mb_strpos finds HERE in multibyte at: '.mb_strpos($original_multibyte_string,'HERE',0,'UTF-8').' '.'mb_strpos finds HERE in non-multibyte at: '.mb_strpos($a_non_multibyte_str_same_length,'HERE',0,'UTF-8');
// OUTPUTS: mb_strpos finds HERE in multibyte at: 9 mb_strpos finds HERE in non-multibyte at: 9

http://3v4l.org/ksYal

于 2015-04-03T13:02:42.133 に答える
1

これは、これらの関数が UTF8 文字をサポートしていないためです。

a = 1 ビットのエンコード ă = 2 ビットのエンコード

答えです!

于 2015-04-03T13:07:36.643 に答える