လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> အက်ခရာ encoding mismatch သည်မှားယွင်းသောအနေအထားသို့ပြန်လာရန် iCONV_STRRPOS ကိုဖြစ်ပေါ်စေသည်

အက်ခရာ encoding mismatch သည်မှားယွင်းသောအနေအထားသို့ပြန်လာရန် iCONV_STRRPOS ကိုဖြစ်ပေါ်စေသည်

gitbox 2025-06-03

ဘာသာစကားမျိုးစုံသောစာသားပြုပြင်ခြင်းအတွက် PHP ကိုအသုံးပြုသောအခါ iconv_strrpos သည် string တစ်ခုတွင်ဇာတ်ကောင်တစ် ဦး ၏နောက်ဆုံးဖြစ်ပျက်မှုကိုရှာဖွေရန်ဘုံ function တစ်ခုဖြစ်သည်။ သို့သော်အမှန်တကယ်ဖွံ့ဖြိုးတိုးတက်မှုတွင်, 0 င်လာသည့် string encoding သည်သတ်မှတ်ထားသော encoding နှင့်မကိုက်ညီပါက iCONV_STRRPOS သည် "အမှား" အနေအထားကိုပြန်ပို့နိုင်သည်သို့မဟုတ် မှားယွင်းစွာ တုံ့ပြန်နိုင်သည်။ ဤပြ problem နာသည်အထူးသဖြင့်မျိုးစပ်သော coding သို့မဟုတ် ununrum on coding လုပ်သည့်အခြေအနေတွင်ပြုလုပ်ရန်ခက်ခဲသည်။

ဤဆောင်းပါးသည်ဤပြ problem နာကိုအဘယ်ကြောင့်တွေ့ရှိရပြီးယုံကြည်စိတ်ချရသောဖြေရှင်းနည်းပေးရန်အကြောင်းလေ့လာသုံးသပ်လိမ့်မည်။

iconv_strrpos ၏အခြေခံအသုံးပြုမှု

IcONV_STRPOX ၏ syntax သည်အောက်ပါအတိုင်းဖြစ်သည် -

 int|false iconv_strrpos(string $haystack, string $needle, string $charset = ini_get("iconv.internal_encoding"))

သတ်မှတ်ထားသော charset အပေါ် အခြေခံ. မြက်ခင်းပြင် ၌ (အက္ခရာများတွင်) တွင် (ဇာတ်ကောင်များတွင်) ၌ အပ် ၏နောက်ဆုံးဖြစ်ပျက်မှုကိုပြန်လည်ရောက်ရှိစေသည်။ မှတ်ချက် - ၎င်းသည် byte offset မဟုတ်ဘဲဇာတ်ကောင်အနေအထားဖြစ်သည်။

ဥပမာအားဖြင့်:

 $str = "မင်္ဂလာပါ,ကမ်ာဘ!";
$pos = iconv_strrpos($str, "နယ်နိမိတ်", "UTF-8");
echo $pos; // ပုံမှန် output ကို 4

ကိုက်ညီမှု encoding ၏ပြ problem နာ

$ str သည်အမှန်တကယ် GBK encoding တွင် string တစ်ခုဖြစ်ပြီးသင်ဖြတ်သန်းသွားသော encoding encoding encoding encoding သည် "utf-8" ဖြစ်သည်။ ICONV_STRRPOS သည် GBK encoding content ကို UTF-8 အရသိရသည်။

  1. ခွဲခြမ်းစိတ်ဖြာမှု မအောင်မြင် ပါ,

  2. Parsing သည်အောင်မြင်သော်လည်း ETF-8 သည်ဇာတ်ကောင်တစ် ဦး လျှင် 1 ~ 4 bytes 1 ကို 1 မှ 4 ဒြပ်စင်များဖြင့်ပြုလုပ်သည်။

ဥပမာအားဖြင့်:

 $str = file_get_contents("http://gitbox.net/data/sample-gbk.txt"); // မုချ GBK ကုဒ်
$pos = iconv_strrpos($str, "နယ်နိမိတ်", "UTF-8");
var_dump($pos); // ပြန်လာရန်ဖြစ်နိုင်သည် false သို့မဟုတ်မှားယွင်းသောအနေအထား

ဘာကြောင့်ဒီလိုဖြစ်ရတာလဲ

ICONV စီးရီးလုပ်ဆောင်ချက်များသည်စာလုံးအလုံးစုံပြောင်းလဲခြင်းစာကြည့်တိုက်၏အောက်ခြေတွင်အလုပ်လုပ်သည်။ ဇာတ်ကောင် encoding ကိုက်ညီမှုသည်

  • iCONV_STRRPOS သည် byte sequence ကိုမှန်ကန်သောစာလုံးများအဖြစ်ခွဲခြမ်းစိတ်ဖြာရန်ကြိုးစားလိမ့်မည်။

  • တရားမ 0 င သောအစီအစဉ်များကိုဖြစ်ပေါ်ပါ

  • အကယ်. တစ်စိတ်တစ်ပိုင်းတရားဝင် (သို့မဟုတ်သဟဇာတသဟဇာတစာလုံးများ) ပါကအမှားအယွင်းများခွဲခြမ်းစိတ်ဖြာပြီးနောက်ပြန်လည်နေရာချထားသည့်နေရာကိုဇာတ်ကောင်စီးပေါ် မူတည်. တွက်ချက်သည်။

အမှားတွေကိုဘယ်လိုရှောင်ရှားရမလဲ။

1 ။ string encoding နှင့်သတ်မှတ်ထားသော encoding တသမတ်တည်းဖြစ်ကြောင်းသေချာပါစေ

ဒါကအခြေခံအကျဆုံးဖြေရှင်းနည်းပါ။ iCONV_STRRPOS ကို မခေါ်မီ string သည်သတ်မှတ်ထားသော encoding ဖြစ်သည်ကိုသေချာအောင်လုပ်ရမည်။

 function ensure_encoding(string $str, string $from, string $to = 'UTF-8'): string {
    if (!mb_check_encoding($str, $to)) {
        return iconv($from, $to . "//IGNORE", $str);
    }
    return $str;
}

$str = file_get_contents("http://gitbox.net/data/sample-gbk.txt");
$str = ensure_encoding($str, "GBK", "UTF-8");
$pos = iconv_strrpos($str, "နယ်နိမိတ်", "UTF-8");
echo $pos;

2 ။ အစား MB_STRRPOS ကို သုံးပါ

Multibyte ပတ်ဝန်းကျင်တွင် MB_Strropos သည် Encoding ကိုပိုမိုတည်ငြိမ်စွာကိုင်တွယ်သောကြောင့် MB_Strpos သည်ပိုမိုလုံခြုံသောရွေးချယ်မှုဖြစ်သည်။

 mb_internal_encoding("UTF-8");
$pos = mb_strrpos($str, "နယ်နိမိတ်");

တစ်ချိန်တည်းမှာပင် MB_Strpos သည် parsing များအတွက် MB_Trinternal_encoding ကို တင်းကြပ်စွာလိုက်နာလိမ့်မည်။

3 ။ အကြောင်းအရာအရင်းအမြစ်အတွက် Unified encoding format ကို

အကြောင်းအရာရင်းမြစ်များအားလုံး (ဒေတာဘေ့စ်များ, ဥပမာအားဖြင့်, ဖိုင်တစ်ခုကိုဖတ်သည့်အခါ encoding ကိုသင်အတင်းဖိအားပေးနိုင်သည်။

 $str = file_get_contents("http://gitbox.net/data/sample-utf8.txt");
// နေရင် GBK ဖိုင်စနစ်,ကိုယ်တိုင်ပြောင်းလဲ
$str = iconv("GBK", "UTF-8//IGNORE", $str);

အကျဉ်းချုပ်

IcONV_STRPOS သည် မှားယွင်းသောမတိုက်ဆိုင်သည့်မတိုက်ဆိုင်သည့်မတိုက်ဆိုင်မှုတွင်မတည်မငြိမ်ဖြစ်နေသည်။ ဒါကိုရှောင်ရှားရန်

  • String ၏အမှန်တကယ် encoding သည်ဝင်လာသော charset နှင့်ကိုက်ညီကြောင်းသေချာပါစေ။

  • ဇာတ်ကောင်အနေအထားအပြောင်းအလဲအတွက် MB_Strropos ကို အသုံးပြု. ဦး စားပေးထားသည်။

  • စနစ်၏အတွင်းပိုင်း encoding ကိုတသမတ်တည်းထားရှိပါ (UTF-8 အကြံပြု);

encodency ရှေ့နောက်ညီညွတ်မှုကိုအတည်ပြုပြီးသည်နှင့် iconv_strpos သည် ယုံကြည်စိတ်ချရနိုင်သော်လည်းအချက်အလက်အရင်းအမြစ်ကိုသင်လုံလောက်သောထိန်းချုပ်မှုနှင့်နားလည်မှုရှိလျှင်သာဖြစ်သည်။ ဒီလိုမှမဟုတ်ရင် MB_ * စီးရီး function ကိုအသုံးပြုပြီးလုံခြုံမှုရှိလိမ့်မယ်။