STRICMP () PHP ရှိလက်တင်စာများသို့မဟုတ်တန်ချိန်များပါ 0 င်သောလက်တင်အက္ခရာများပါ 0 င်သည့်အတွက် "နှိုင်းယှဉ်ချက်ရလဒ်သည်မမှန်ကန်ပါ" ဟုသင်ကြုံတွေ့ရလိမ့်မည်။ လူအများစုကဤ "garbled code" ကိုစုပေါင်းခေါ်ဆိုကြသည်။ တကယ်တော့ strcmp () သူ့ဟာသူသည်ဇာတ်ကောင်များကိုရှုပ်ထွေးစေနိုင်စွမ်းမရှိပါ။ ပြ Proble နာများသည် မကိုက်ညီသောဇာတ်ကောင် encoding , မတူညီသောစာသားပုံမှန် သို့မဟုတ် မှားယွင်းသောနှိုင်းယှဉ်မှုကိရိယာမှားသည် ။
အောက်ဖော်ပြပါအချက်များသည်အဓိကအကြောင်းပြချက်များနှင့်လုပ်ငန်းလည်ပတ်မှုဖြေရှင်းနည်းများကိုတစ်ပြိုင်နက်တည်းရှင်းပြသည်။
Binary Safe, Case Sensitive : StrcMP ($ a, $ ခ) က $ a နှင့် $ b ကို byte အမိန့်နှင့်နှိုင်းယှဉ်ထားသည် ။ UTF-8, GBK, EMOJI ကိုနားမလည်နိုင်ပါ ။ ၎င်းသည် "အက္ခရာစဉ်အမျိုးမျိုးစည်းမျဉ်းစည်းကမ်းတွေကိုနားမလည်,
နိဂုံး - ကြိုးနှစ်ချောင်း သည် မတူညီသော encodings ကိုသုံးပါကသို့မဟုတ် UTF-8 နှစ်မျိုးလုံးရှိသော်သော်လည်း,
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-string">"a"</span></span><span>, </span><span><span class="hljs-string">"b"</span></span><span>)); </span><span><span class="hljs-comment">// int(-1) ပုံမှန်ဖြစ်သော:a < b</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-string">"တရုတ်"</span></span><span>, </span><span><span class="hljs-string">"လူသူမ"</span></span><span>)); </span><span><span class="hljs-comment">// နှိုင်းယှဉ် UTF-8 的လူသူမ节序,ရလဒ်တသမတ်တည်းမဖြစ်နိုင်ပါ“တရုတ်လူသူမ拼音顺序”</span></span><span>
</span></span> ကိုက်ညီမှုမရှိသော encoding (UTF-8 vs gbk စသည်)
တူညီသော "တရုတ်", တစ်ခုမှာ UTF-8 ဖြစ်ပြီးအခြားတစ်ခုမှာ GBK ဖြစ်ပြီး Bytes သည်လုံးဝကွဲပြားခြားနားသည်။ strcmp () သည် bytes များကိုသာကြည့်ရှုပါ။
UTF-8 BOM နှင့်မမြင်ရတဲ့ဇာတ်ကောင် <br> <br> BOM (EF BB BF) , သုညအကျယ်အာကာသ (zwsp) နှင့်မမြင်နိုင်သောထိန်းချုပ်မှုဇာတ်ကောင်များဖိုင် header သို့မဟုတ် input ကိုပထမ ဦး ဆုံး byte / နောက်ဆုံး byte ကိုကွဲပြားခြားနားစေလိမ့်မည်။
ပုံမှန်ကွဲပြားခြားနားမှုများ (NFC / NFD)
é တစ်ခုတည်းသောဇာတ်ကောင် (NFC) သို့မဟုတ် "E + ပေါင်းစပ်ထားသော accent" (NFD) ဖြစ်နိုင်သည်။ လူ့မျက်စိများသည်အတူတူပင်ဖြစ်သည် ။
"လူ့အသားဖ် / ဘာသာစကားစည်းမျဉ်းစည်းကမ်းများ" ကိုမျှော်လင့်ပါ, တရုတ် Pinyin, ဂျာမန်လူမျိုးများအနေဖြင့်အနိုင်ရလိုလား။ ပြင်သစ်အသံထွက်များ, StrcMP () သည် ဤအရာကိုနားမလည်။ ဒေသဆိုင်ရာနှိုင်းယှဉ်ကိရိယာတစ်ခု လိုအပ်သည်။
0 င်ခွင့်ပေါင်းစည်းခြင်း - ဒေတာဘေ့ စ် ဆက်သွယ်မှု,
BOM / Control character များကိုဖယ်ရှားပါ ။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">strip_bom_and_controls</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$s</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
</span><span><span class="hljs-comment">// သွား BOM</span></span><span>
</span><span><span class="hljs-variable">$s</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/^\xEF\xBB\xBF/'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$s</span></span><span>);
</span><span><span class="hljs-comment">// သွား常见零宽လူသူမ符:ZWSP, ZWNJ, ZWJ, NBSP …</span></span><span>
</span><span><span class="hljs-variable">$s</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/[\x{200B}\x{200C}\x{200D}\x{00A0}]/u'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$s</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$s</span></span><span>;
}
</span></span>လိုအပ်ပါကပြောင်းလဲပါ
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$clean</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'UTF-8,GBK,GB2312,BIG5,ISO-8859-1'</span></span><span>);
</span></span>NFC သို့စည်းလုံးစေရန် intl extension ကို install လုပ်ပါ။ Enable လုပ်ပါ။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">class_exists</span></span><span>(</span><span><span class="hljs-string">'Normalizer'</span></span><span>)) {
</span><span><span class="hljs-variable">$a</span></span><span> = </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-title function_ invoke__">normalize</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-variable constant_">FORM_C</span></span><span>);
</span><span><span class="hljs-variable">$b</span></span><span> = </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-title function_ invoke__">normalize</span></span><span>(</span><span><span class="hljs-variable">$b</span></span><span>, </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-variable constant_">FORM_C</span></span><span>);
}
</span></span>"byte ရှေ့နောက်ညီညွတ်မှု" ကိုပဲ "strcmp ကို သုံးပါ။ သို့မဟုတ်အသေးအဖွဲအာရုံမခံစားနိုင်သော byte နှိုင်းယှဉ်မှုကိုလိုချင်သည်, stricasecmp () (byte, ascii စည်းမျဉ်းစည်းကမ်းများ) ကိုသုံးပါ။
လူ့ဖတ်နိုင်သော / ဘာသာစကားစည်းမျဉ်းများကိုနှိုင်းယှဉ်ခြင်း (sorting / deching / ရှာဖွေခြင်း / ရှာဖွေခြင်း) : IntL \ collator ကို သုံးပါ (ဒေသဆိုင်ရာနှိုင်းယှဉ်မှု, accent, accent, adcase, adcase, စာလုံးအကြီး,
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$coll</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">\Collator</span></span><span>(</span><span><span class="hljs-string">'zh_CN'</span></span><span>); </span><span><span class="hljs-comment">// သို့မဟုတ် 'zh-Hans-CN', 'en_US', 'de_DE' စောင့်</span></span><span>
</span><span><span class="hljs-variable">$coll</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setStrength</span></span><span>(</span><span><span class="hljs-title class_">\Collator</span></span><span>::</span><span><span class="hljs-variable constant_">SECONDARY</span></span><span>); </span><span><span class="hljs-comment">// 忽略大小写但区分重音စောင့်</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$coll</span></span><span>-></span><span><span class="hljs-title function_ invoke__">compare</span></span><span>(</span><span><span class="hljs-string">'တရုတ်'</span></span><span>, </span><span><span class="hljs-string">'လူသူမ'</span></span><span>)); </span><span><span class="hljs-comment">// -1/0/1,ဘာသာစကားစည်းမျဉ်းများအပေါ်အခြေခံသည်</span></span><span>
</span></span>emoji ကိုတစ်ဝက်ခွဲခြင်းမှရှောင်ရှားရန် "graweme clusters" ကို သုံးရန် "graweme clusters" ကိုသုံးရန် " grageme clusters" ကိုသုံးရန် "Grageme Clusters" ကိုသုံးရန် "GrageMe Clusters" ကိုသုံးရန်လိုအပ်သည်။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$text</span></span><span> = </span><span><span class="hljs-string">"?????တိုးတက်ရေး"</span></span><span>; </span><span><span class="hljs-comment">// ပါဝင် ZWJ Connector ရဲ့ emoji</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">grapheme_substr</span></span><span>(</span><span><span class="hljs-variable">$text</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// ?????ဖွင့်လှစ်</span></span><span>
</span></span>လျစ်လျူရှုခံရဖို့လိုအပ်တဲ့ multi-byte နှိုင်းယှဉ်ချက်များ - MB_strtolower သို့မဟုတ် mb_convert_case ကို သုံးပါ။
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$a</span></span><span> = </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-title function_ invoke__">normalize</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-variable constant_">FORM_C</span></span><span>);
</span><span><span class="hljs-variable">$b</span></span><span> = </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-title function_ invoke__">normalize</span></span><span>(</span><span><span class="hljs-variable">$b</span></span><span>, </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-variable constant_">FORM_C</span></span><span>);
</span><span><span class="hljs-variable">$aFold</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_strtolower</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-variable">$bFold</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_strtolower</span></span><span>(</span><span><span class="hljs-variable">$b</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-variable">$aFold</span></span><span>, </span><span><span class="hljs-variable">$bFold</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>);
</span></span> <span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$names</span></span><span> = [</span><span><span class="hljs-string">'Zhang San'</span></span><span>, </span><span><span class="hljs-string">'li si'</span></span><span>, </span><span><span class="hljs-string">'ဝမ်ဝူ'</span></span><span>, </span><span><span class="hljs-string">'ြရိ'</span></span><span>, </span><span><span class="hljs-string">'cao cao'</span></span><span>];
</span><span><span class="hljs-variable">$coll</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">\Collator</span></span><span>(</span><span><span class="hljs-string">'zh_CN@collation=pinyin'</span></span><span>); </span><span><span class="hljs-comment">// စနစ်လိုအပ်သည် ICU ထောက်</span></span><span>
</span><span><span class="hljs-variable">$coll</span></span><span>-></span><span><span class="hljs-title function_ invoke__">sort</span></span><span>(</span><span><span class="hljs-variable">$names</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$names</span></span><span>);
</span></span> <span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$input</span></span><span> = [</span><span><span class="hljs-string">'café'</span></span><span>, </span><span><span class="hljs-string">'Cafe'</span></span><span>, </span><span><span class="hljs-string">'CAFé'</span></span><span>, </span><span><span class="hljs-string">'cafe'</span></span><span>];
</span><span><span class="hljs-variable">$coll</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">\Collator</span></span><span>(</span><span><span class="hljs-string">'fr_FR'</span></span><span>);
</span><span><span class="hljs-variable">$coll</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setStrength</span></span><span>(</span><span><span class="hljs-title class_">\Collator</span></span><span>::</span><span><span class="hljs-variable constant_">PRIMARY</span></span><span>); </span><span><span class="hljs-comment">// accents နှင့်အကြီးအသေးများကိုလျစ်လျူရှုပါ</span></span><span>
</span><span><span class="hljs-variable">$unique</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$input</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$s</span></span><span>) {
</span><span><span class="hljs-variable">$sN</span></span><span> = </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-title function_ invoke__">normalize</span></span><span>(</span><span><span class="hljs-variable">$s</span></span><span>, </span><span><span class="hljs-title class_">Normalizer</span></span><span>::</span><span><span class="hljs-variable constant_">FORM_C</span></span><span>);
</span><span><span class="hljs-variable">$found</span></span><span> = </span><span><span class="hljs-literal">false</span></span><span>;
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$unique</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$u</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$coll</span></span><span>-></span><span><span class="hljs-title function_ invoke__">compare</span></span><span>(</span><span><span class="hljs-variable">$sN</span></span><span>, </span><span><span class="hljs-variable">$u</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span>) { </span><span><span class="hljs-variable">$found</span></span><span> = </span><span><span class="hljs-literal">true</span></span><span>; </span><span><span class="hljs-keyword">break</span></span><span>; }
}
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$found</span></span><span>) </span><span><span class="hljs-variable">$unique</span></span><span>[] = </span><span><span class="hljs-variable">$sN</span></span><span>;
}
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$unique</span></span><span>); </span><span><span class="hljs-comment">// တစ် ဦး တည်းသာမူကွဲထိန်းသိမ်းထားသည်</span></span><span>
</span></span>Confirm encoding : MB_Detect_encoding ($ s, UTF-8 ', GBK', 'BIG5', 'ISO-8859-1'] , သင်မသေချာပါက UTF-8 သို့ပထမဆုံးလွှဲပြောင်းပါ။
Bom / Zero-width ဇာတ်ကောင်များသို့သွားပါ ။
NFC မှပုံမှန် - ပုံမှန် :: ပုံမှန် () ။
နှိုင်းယှဉ်ချက်ပန်းတိုင်များကိုရှင်းလင်းပါ ။
byte ရှေ့နောက်ညီညွတ်မှု - StrcMP / strcasecmp ။
ဘာသာစကားစည်းမျဉ်းစည်းကမ်း / တန်းတူညီမျှမှု: IntL \ collator ။
Visual ဇာတ်ကောင်အဆင့်အပြောင်းအလဲနဲ့: grapeme_ * ။
ဒေတာဘေ့စ ် သည် HTTP Header နှင့်ကိုက်ညီသည် ။ MySQL သည် UTF8MB4 နှင့် UTF8MB4_0900_AAI_AA_AI_CI တို့ဖြစ်သည် ။ Charset = UTF-8 ။
"ဒါဟာတူညီတဲ့ UTF-8, strcmp () တန်းတူမဟုတ်တာဘာကြောင့်လဲ"
၎င်းကို BOM, သုညအကျယ်အက္ခရာများနှင့်ရောနှောနေနိုင်သည်။ စင်ကြယ် + ပထမ ဦး ဆုံးစံသတ်မှတ်ချက်။
" stricasecmp () ကို အမှုများမခံစားနိုင်ပါသလော။ "
၎င်း၏ခြံအဓိကအားဖြင့် ASCII semantics ဖြစ်ပါတယ်။ ပိုမိုယုံကြည်စိတ်ချရသောအလေ့အကျင့်: MB_StrTOlower () ကိုနှိုင်းယှဉ်ခြင်းသို့မဟုတ်သင့်လျော်သော collator ကိုသုံးပါ။
"emoji / ပေါင်းစပ်ထားသောစကားလုံးသည်ပုံမှန်မဟုတ်သောသို့မဟုတ်ပုံမှန်မဟုတ်သောဟုသတ်မှတ်သည်။
confreme_strlen / grapeme_substr ကို သုံး. User-Visable ဇာတ်ကောင်များပြုလုပ်ရန် strlen / substrmscrms ကို မသုံးပါနှင့်။