လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> strcmp function သည် garbled ပေါ်လာမည်လား။ အကြောင်းပြချက်နှင့်ဇာတ်ကောင် encoding ပြ problems နာများကိုရှောင်ရှားရန်အကြောင်းပြချက်နှင့်ဘယ်လို

strcmp function သည် garbled ပေါ်လာမည်လား။ အကြောင်းပြချက်နှင့်ဇာတ်ကောင် encoding ပြ problems နာများကိုရှောင်ရှားရန်အကြောင်းပြချက်နှင့်ဘယ်လို

gitbox 2025-09-11

STRICMP () PHP ရှိလက်တင်စာများသို့မဟုတ်တန်ချိန်များပါ 0 င်သောလက်တင်အက္ခရာများပါ 0 င်သည့်အတွက် "နှိုင်းယှဉ်ချက်ရလဒ်သည်မမှန်ကန်ပါ" ဟုသင်ကြုံတွေ့ရလိမ့်မည်။ လူအများစုကဤ "garbled code" ကိုစုပေါင်းခေါ်ဆိုကြသည်။ တကယ်တော့ strcmp () သူ့ဟာသူသည်ဇာတ်ကောင်များကိုရှုပ်ထွေးစေနိုင်စွမ်းမရှိပါ။ ပြ Proble နာများသည် မကိုက်ညီသောဇာတ်ကောင် encoding , မတူညီသောစာသားပုံမှန် သို့မဟုတ် မှားယွင်းသောနှိုင်းယှဉ်မှုကိရိယာမှားသည်

အောက်ဖော်ပြပါအချက်များသည်အဓိကအကြောင်းပြချက်များနှင့်လုပ်ငန်းလည်ပတ်မှုဖြေရှင်းနည်းများကိုတစ်ပြိုင်နက်တည်းရှင်းပြသည်။

1 ။ strcmp () ဘာလုပ်သလဲ။

  • Binary Safe, Case Sensitive : StrcMP ($ a, $ ခ) က $ a နှင့် $ b ကို byte အမိန့်နှင့်နှိုင်းယှဉ်ထားသည် UTF-8, GBK, EMOJI ကိုနားမလည်နိုင်ပါ ။ ၎င်းသည် "အက္ခရာစဉ်အမျိုးမျိုးစည်းမျဉ်းစည်းကမ်းတွေကိုနားမလည်,

  • နိဂုံး - ကြိုးနှစ်ချောင်း သည် မတူညီသော encodings ကိုသုံးပါကသို့မဟုတ် UTF-8 နှစ်မျိုးလုံးရှိသော်သော်လည်း,

 <span><span><span class="hljs-meta">&lt;?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 &lt; 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>

2 ။ ဘုံ "garbled code / နှိုင်းယှဉ်ပုံမှန်မဟုတ်သော၏အဓိကအကြောင်းရင်းလေးခု"

  1. ကိုက်ညီမှုမရှိသော encoding (UTF-8 vs gbk စသည်)
    တူညီသော "တရုတ်", တစ်ခုမှာ UTF-8 ဖြစ်ပြီးအခြားတစ်ခုမှာ GBK ဖြစ်ပြီး Bytes သည်လုံးဝကွဲပြားခြားနားသည်။ strcmp () သည် bytes များကိုသာကြည့်ရှုပါ။

  2. UTF-8 BOM နှင့်မမြင်ရတဲ့ဇာတ်ကောင် <br> <br> BOM (EF BB BF) , သုညအကျယ်အာကာသ (zwsp) နှင့်မမြင်နိုင်သောထိန်းချုပ်မှုဇာတ်ကောင်များဖိုင် header သို့မဟုတ် input ကိုပထမ ဦး ဆုံး byte / နောက်ဆုံး byte ကိုကွဲပြားခြားနားစေလိမ့်မည်။

  3. ပုံမှန်ကွဲပြားခြားနားမှုများ (NFC / NFD)
    é တစ်ခုတည်းသောဇာတ်ကောင် (NFC) သို့မဟုတ် "E + ပေါင်းစပ်ထားသော accent" (NFD) ဖြစ်နိုင်သည်။ လူ့မျက်စိများသည်အတူတူပင်ဖြစ်သည်

  4. "လူ့အသားဖ် / ဘာသာစကားစည်းမျဉ်းစည်းကမ်းများ" ကိုမျှော်လင့်ပါ, တရုတ် Pinyin, ဂျာမန်လူမျိုးများအနေဖြင့်အနိုင်ရလိုလား။ ပြင်သစ်အသံထွက်များ, StrcMP () သည် ဤအရာကိုနားမလည်။ ဒေသဆိုင်ရာနှိုင်းယှဉ်ကိရိယာတစ်ခု လိုအပ်သည်။

3 ။ ရှောင်ရှားရန်မည်သို့ - အကောင်အထည်ဖော်နိုင်သည့်ဖြေရှင်းချက်အစုတခု

1) UTF-8 သို့စည်းလုံးညီညွှတ်ရန် (အဘယ်သူမျှမကန့်သတ်)

  • 0 င်ခွင့်ပေါင်းစည်းခြင်း - ဒေတာဘေ့ စ် ဆက်သွယ်မှု,

  • BOM / Control character များကိုဖယ်ရှားပါ

 <span><span><span class="hljs-meta">&lt;?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">&lt;?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>

2) unicode ပုံမှန်လုပ်ဆောင်ပါ

  • NFC သို့စည်းလုံးစေရန် intl extension ကို install လုပ်ပါ။ Enable လုပ်ပါ။

 <span><span><span class="hljs-meta">&lt;?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>

3) "မှန်ကန်သောနှိုင်းယှဉ်မှု function" ကိုရွေးချယ်ပါ

  • "byte ရှေ့နောက်ညီညွတ်မှု" ကိုပဲ "strcmp ကို သုံးပါ။ သို့မဟုတ်အသေးအဖွဲအာရုံမခံစားနိုင်သော byte နှိုင်းယှဉ်မှုကိုလိုချင်သည်, stricasecmp () (byte, ascii စည်းမျဉ်းစည်းကမ်းများ) ကိုသုံးပါ။

  • လူ့ဖတ်နိုင်သော / ဘာသာစကားစည်းမျဉ်းများကိုနှိုင်းယှဉ်ခြင်း (sorting / deching / ရှာဖွေခြင်း / ရှာဖွေခြင်း) : IntL \ collator ကို သုံးပါ (ဒေသဆိုင်ရာနှိုင်းယှဉ်မှု, accent, accent, adcase, adcase, စာလုံးအကြီး,

 <span><span><span class="hljs-meta">&lt;?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>-&gt;</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>-&gt;</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">&lt;?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">&lt;?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>

4) Sorting နှင့် Dilution စစ်ဆေးခြင်း၏ဥပမာအလေ့အကျင့်

တရုတ် Pinyin (သိထား)

 <span><span><span class="hljs-meta">&lt;?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>-&gt;</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">&lt;?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>-&gt;</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>-&gt;</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>

4 ။ လျင်မြန်စွာအမှား - စုံစမ်းမှုစာရင်း ("garbled code" ကိုဖြတ်သန်းပါ။ )

  1. Confirm encoding : MB_Detect_encoding ($ s, UTF-8 ', GBK', 'BIG5', 'ISO-8859-1'] , သင်မသေချာပါက UTF-8 သို့ပထမဆုံးလွှဲပြောင်းပါ။

  2. Bom / Zero-width ဇာတ်ကောင်များသို့သွားပါ

  3. NFC မှပုံမှန် - ပုံမှန် :: ပုံမှန် ()

  4. နှိုင်းယှဉ်ချက်ပန်းတိုင်များကိုရှင်းလင်းပါ

    • byte ရှေ့နောက်ညီညွတ်မှု - StrcMP / strcasecmp

    • ဘာသာစကားစည်းမျဉ်းစည်းကမ်း / တန်းတူညီမျှမှု: IntL \ collator

    • Visual ဇာတ်ကောင်အဆင့်အပြောင်းအလဲနဲ့: grapeme_ *

  5. ဒေတာဘေ့စ သည် HTTP Header နှင့်ကိုက်ညီသည် ။ MySQL သည် UTF8MB4 နှင့် UTF8MB4_0900_AAI_AA_AI_CI တို့ဖြစ်သည် ။ Charset = UTF-8

5 ။ မကြာခဏမေးလေ့ရှိသောမေးခွန်းများ - ပုံမှန် "တွင်း" အများအပြား

  • "ဒါဟာတူညီတဲ့ UTF-8, strcmp () တန်းတူမဟုတ်တာဘာကြောင့်လဲ"
    ၎င်းကို BOM, သုညအကျယ်အက္ခရာများနှင့်ရောနှောနေနိုင်သည်။ စင်ကြယ် + ပထမ ဦး ဆုံးစံသတ်မှတ်ချက်။

  • " stricasecmp () ကို အမှုများမခံစားနိုင်ပါသလော။ "
    ၎င်း၏ခြံအဓိကအားဖြင့် ASCII semantics ဖြစ်ပါတယ်။ ပိုမိုယုံကြည်စိတ်ချရသောအလေ့အကျင့်: MB_StrTOlower () ကိုနှိုင်းယှဉ်ခြင်းသို့မဟုတ်သင့်လျော်သော collator ကိုသုံးပါ။

  • "emoji / ပေါင်းစပ်ထားသောစကားလုံးသည်ပုံမှန်မဟုတ်သောသို့မဟုတ်ပုံမှန်မဟုတ်သောဟုသတ်မှတ်သည်။
    confreme_strlen / grapeme_substr ကို သုံး. User-Visable ဇာတ်ကောင်များပြုလုပ်ရန် strlen / substrmscrms ကို မသုံးပါနှင့်။