2015-04-03 111 views
2

我有以下功能轉換的特殊重音字符(如A)爲-ZA-Z字符串中的字符:爲什麼strpos返回不同的結果?

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_translated被翻譯的字符串。

當我使用strpos(a, string_to_find)strpos(a_translated, string_to_find),返回的值是不同的。我也檢查了strlen(a)strlen(a_translate),他們給出了不同的結果。 這是爲什麼發生?

我需要這樣的解釋,因爲我需要搜索,如果有口音的字符串包含給定普通的字符串(不帶重音),但我必須從原始的字符串返回的部分,我發現它,即使它包含重音。

我試過 我翻譯原始字符串,找到位置searched_string開始的地方,然後我substr(ORIGINAL_STRING, position)。這是我注意到職位不符合的地方。

例子: 原始字符串:Universitatea一個FOST înfiinţată在2001年pentru一個oferi ... 搜索的字符串:infiintata 期望的結果:înfiinţată在2001年pentru一個oferi ...

+0

有什麼區別? – 2015-04-03 13:01:19

+0

@BartFriederichs strpos在包含重音符和相同字符串但翻譯的字符串中搜索字符串(例如infiintata)時給了我不同的結果。例如234和265 – 2015-04-03 13:04:05

回答

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

+0

非常感謝您的回答,它的工作!祝你今天過得愉快! – 2015-04-03 13:17:34

1

這是因爲這些功能不支持UTF8字符。

A = 1位編碼 A = 2位編碼

它的答案!

+0

非常感謝您的回答,祝您有美好的一天! – 2015-04-03 13:18:08

相關問題