Почему strpos возвращает разные результаты?

У меня есть следующая функция, которая преобразует специальные символы ударения (например, ă) в символы 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) и они дают разные результаты.
Почему это происходит?

Мне нужно это объяснение, потому что Мне нужно искать, содержит ли строка с ударениями заданную нормальную строку (без ударений), но я должен вернуть часть исходной строки, где я ее нашел, даже если она содержит акценты.

Что я пробовал
Я перевожу исходную строку и нахожу позицию, где начинается искомая строка, затем я substr(ORIGINAL_STRING, position), Здесь я заметил, что позиции не соответствуют.

Пример:
ОРИГИНАЛЬНАЯ СТРУНА: Университетский праздник înfiinţată В 2001 году компания предлагает …
ПОИСКОВАЯ СТРОКА: infiintata
ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ: înfiinţată В 2001 году компания предлагает …

2

Решение

Позиция, из которой вы получаете 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

5

Другие решения

Это потому, что эти функции не поддерживают символы UTF8.

а = 1 битная кодировка
= 2-битная кодировка

Это ответ!

1

По вопросам рекламы [email protected]