Kode berikut digunakan untuk pengkodean GB2312. Mencegat string berbahasa Mandarin adalah hal yang memusingkan di PHP. Solusinya adalah menentukan apakah itu karakter byte ganda berdasarkan apakah nilainya lebih besar dari atau sama dengan 128 untuk menghindari karakter yang kacau. Namun masalah seperti pencampuran bahasa Mandarin dan Inggris, simbol khusus, dll selalu ada. Sekarang saya akan menulis yang lebih komprehensif untuk referensi saja:
Deskripsi program:
1. Parameter len didasarkan pada karakter Cina. 1len sama dengan 2 karakter bahasa Inggris untuk membuat bentuknya lebih indah
2. Jika parameter ajaib disetel ke false, bahasa Mandarin dan Inggris akan diperlakukan sama dan jumlah karakter absolut akan diambil.
3. Sangat cocok untuk string yang dikodekan dengan htmlspecialchars()
4. Dapat menangani kode program mode karakter entitas (𖰰) dengan benar
di GB2312:
fungsi FSubstr($judul,$mulai,$len="",$ajaib=benar)
{
/**
* didukung oleh Smartpig
* mailto:[email protected]
*/
$panjang = 0;
if($len == "") $len = strlen($title);
//Menilai bahwa posisi awal salah
jika($mulai > 0)
{
$cnum = 0;
untuk($i=0;$i<$mulai;$i++)
{
if(ord(substr($judul,$i,1)) >= 128) $cnum ++;
}
if($cnum%2 != 0) $mulai--;
tidak disetel($cnum);
}
if(strlen($judul)<=$len) return substr($judul,$mulai,$len)
;
$blen = 0;
$angka nyata = 0;
untuk($i=$mulai;$i<strlen($judul);$i++)
{
$ctype = 0;
$clangkah = 0;
$cur = substr($judul,$i,1);
if($cur == "&")
{
if(substr($judul,$i,4) == "<")
{
$clangkah = 4;
$panjang += 4;
$i += 3;
$angka nyata++;
jika($ajaib)
{
$alen++;
}
}
else if(substr($judul,$i,4) == ">")
{
$clangkah = 4;
$panjang += 4;
$i += 3;
$angka nyata++;
jika($ajaib)
{
$alen++;
}
}
else if(substr($judul,$i,5) == "&")
{
$clangkah = 5;
$panjang += 5;
$i += 4;
$angka nyata++;
jika($ajaib)
{
$alen++;
}
}
else if(substr($judul,$i,6) == """)
{
$clangkah = 6;
$panjang += 6;
$i += 5;
$angka nyata++;
jika($ajaib)
{
$alen++;
}
}
else if(substr($judul,$i,6) == "'")
{
$clangkah = 6;
$panjang += 6;
$i += 5;
$angka nyata++;
jika($ajaib)
{
$alen++;
}
}
else if(preg_match("/&#(d+);/i",substr($title,$i,8),$match))
{
$cstep = strlen($cocok[0]);
$panjang += strlen($cocok[0]);
$i += strlen($cocok[0])-1;
$angka nyata++;
jika($ajaib)
{
$blen++;
$ctype = 1;
}
}
}kalau tidak{
if(ord($skr)>=128)
{
$clangkah = 2;
$panjang += 2;
$i += 1;
$angka nyata++;
jika($ajaib)
{
$blen++;
$ctype = 1;
}
}kalau tidak{
$clangkah = 1;
$panjang +=1;
$angka nyata++;
jika($ajaib)
{
if(ord($skr) >= 65 && ord($skr) <= 90)
{
$blen++;
}kalau tidak{
$alen++;
}
}
}
}
jika($ajaib)
{
if(($blen*2+$alen) == ($len*2)) istirahat;
if(($blen*2+$alen) == ($len*2+1))
{
jika($ctype == 1)
{
$panjang -= $clangkah;
merusak;
}kalau tidak{
merusak;
}
}
}kalau tidak{
if($realnum == $len) istirahat;
}
}
tidak disetel($saat ini);
tidak disetel($alen);
tidak disetel($blen);
tidak disetel($angka nyata);
tidak disetel($ctype);
tidak disetel($cstep);
return substr($judul,$mulai,$panjang);
}
Haha, nanti saya juga akan memposting kode pengkodean UTF-8.