为什么 strpos return 会产生不同的结果?
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_translated 是翻译后的字符串。
当我使用 strpos(a, string_to_find)
和 strpos(a_translated, string_to_find)
时,returned 值不同。我还检查了 strlen(a)
和 strlen(a_translate)
,它们给出了不同的结果。
为什么会这样?
我需要这个解释,因为我需要搜索带重音的字符串是否包含给定的普通字符串(不带重音),但我必须return来自我找到它的原始字符串,即使它包含重音符号。
我试过的
我翻译原始字符串并找到 searched_string 开始的位置,然后我 substr(ORIGINAL_STRING, position)
。这是我注意到位置不对应的地方。
示例:
原始字符串:Universitatea a fost înfiinşată în 2001 pentru a oferi...
搜索字符串:infiintata
期望的结果:在 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
因为这些函数不支持UTF8字符
a = 1 位编码
ă = 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)
时,returned 值不同。我还检查了 strlen(a)
和 strlen(a_translate)
,它们给出了不同的结果。
为什么会这样?
我需要这个解释,因为我需要搜索带重音的字符串是否包含给定的普通字符串(不带重音),但我必须return来自我找到它的原始字符串,即使它包含重音符号。
我试过的
我翻译原始字符串并找到 searched_string 开始的位置,然后我 substr(ORIGINAL_STRING, position)
。这是我注意到位置不对应的地方。
示例: 原始字符串:Universitatea a fost înfiinşată în 2001 pentru a oferi... 搜索字符串:infiintata 期望的结果:在 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
因为这些函数不支持UTF8字符
a = 1 位编码 ă = 2 位编码
就是答案!