为什么strpos返回不同的结果


Why does strpos return different results?

我有以下函数,可以将特殊重音字符(如ă)转换为字符串中的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_plated是翻译后的字符串。

当我使用strpos(a, string_to_find)strpos(a_translated, string_to_find)时,返回的值不同。我还检查了strlen(a)strlen(a_translate),它们给出了不同的结果为什么会发生这种情况

我需要这个解释,因为我需要搜索带有重音符号的字符串是否包含给定的正常字符串(没有重音符号),但我必须返回找到它的原始字符串的部分,即使它包含重音符号。

我尝试了什么我翻译原始字符串并找到searched_string开始的位置,然后我substr(ORIGINAL_STRING, position)。这就是我注意到位置不一致的地方。

示例:原始字符串:Universitata a fostînfințatăîn 2001 pentru a oferi。。。搜索字符串:infintata期望的结果:înfințatăîn 2001 pentru a oferi

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

这是因为这些函数不支持UTF8字符。

a=1位编码ă=2位编码

这就是答案!