รหัสต่อไปนี้ใช้สำหรับการเข้ารหัส GB2312 การสกัดกั้นสตริงภาษาจีนเป็นเรื่องที่น่าปวดหัวใน PHP วิธีแก้ไขคือการพิจารณาว่าเป็นอักขระแบบไบต์คู่โดยพิจารณาจากว่าค่ามากกว่าหรือเท่ากับ 128 เพื่อหลีกเลี่ยงอักขระที่อ่านไม่ออก อย่างไรก็ตาม ปัญหาต่างๆ เช่น การผสมภาษาจีนและภาษาอังกฤษ สัญลักษณ์พิเศษ ฯลฯ ยังคงมีอยู่เสมอ ตอนนี้ฉันจะเขียนข้อความที่ครอบคลุมมากขึ้นเพื่อใช้อ้างอิงเท่านั้น:
คำอธิบายโปรแกรม:
1. พารามิเตอร์ len จะขึ้นอยู่กับตัวอักษรจีน 1len เท่ากับ 2 ตัวอักษรภาษาอังกฤษเพื่อให้รูปแบบสวยงามยิ่งขึ้น
2. หากตั้งค่าพารามิเตอร์เวทย์มนตร์เป็นเท็จ ภาษาจีนและอังกฤษจะได้รับการปฏิบัติอย่างเท่าเทียมกัน และจะใช้จำนวนอักขระที่แน่นอน
3. เหมาะอย่างยิ่งสำหรับสตริงที่เข้ารหัสด้วย htmlspecialchars()
4. สามารถจัดการโค้ดโปรแกรมโหมดอักขระเอนทิตี (𖰰) ได้อย่างถูกต้อง
ใน GB2312:
ฟังก์ชั่น FSubstr($title,$start,$len="",$magic=true)
-
-
* ขับเคลื่อนโดย Smartpig
* อีเมลถึง:[email protected]
-
$ ความยาว = 0;
if($len == "") $len = strlen($title);
//ตัดสินว่าตำแหน่งเริ่มต้นไม่ถูกต้อง
ถ้า($เริ่มต้น > 0)
-
$cnum = 0;
สำหรับ($i=0;$i<$start;$i++)
-
if(ord(substr($title,$i,1)) >= 128) $cnum ++;
-
ถ้า($cnum%2 != 0) $start--;
ไม่ได้ตั้งค่า($cnum);
}
if(strlen($title)<=$len) return substr($title,$start,$len);
$alen = 0;
$blen = 0;
$realnum = 0;
for($i=$start;$i<strlen($title);$i++)
-
$cประเภท = 0;
$ซีสเต็ป = 0;
$cur = substr($หัวข้อ,$i,1);
ถ้า($cur == "&")
-
if(substr($title,$i,4) == "<")
-
$ซีสเต็ป = 4;
$ ความยาว += 4;
$i += 3;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$อัลเลน++;
-
-
อย่างอื่นถ้า(substr($title,$i,4) == ">")
-
$ซีสเต็ป = 4;
$ ความยาว += 4;
$i += 3;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$อัลเลน++;
-
-
อย่างอื่นถ้า(substr($title,$i,5) == "&")
-
$cสเต็ป = 5;
$ความยาว += 5;
$i += 4;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$อัลเลน++;
-
-
อย่างอื่นถ้า(substr($title,$i,6) == """)
-
$ซีสเต็ป = 6;
$ ความยาว += 6;
$i += 5;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$อัลเลน++;
-
-
อย่างอื่น if(substr($title,$i,6) == "'")
-
$ซีสเต็ป = 6;
$ ความยาว += 6;
$i += 5;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$อัลเลน++;
-
-
อย่างอื่น if(preg_match("/&#(d+);/i",substr($title,$i,8),$match))
-
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$เบลน++;
$cประเภท = 1;
-
-
}อื่น{
ถ้า(อ๊อด($cur)>=128)
-
$ซีสเต็ป = 2;
$ความยาว += 2;
$i += 1;
$realnum++;
ถ้า($เวทย์มนตร์)
-
$เบลน++;
$cประเภท = 1;
-
}อื่น{
$cสเต็ป = 1;
$ความยาว +=1;
$realnum++;
ถ้า($เวทย์มนตร์)
-
ถ้า(อ๊อด($cur) >= 65 && อ๊อด($cur) <= 90)
-
$เบลน++;
}อื่น{
$อัลเลน++;
-
-
-
-
ถ้า($เวทย์มนตร์)
-
if(($blen*2+$alen) == ($len*2)) พัง;
ถ้า(($blen*2+$alen) == ($len*2+1))
-
ถ้า($ctype == 1)
-
$ความยาว -= $cstep;
หยุดพัก;
}อื่น{
หยุดพัก;
-
-
}อื่น{
if($realnum == $len) พัง;
-
}
ไม่ได้ตั้งค่า($cur);
ไม่ได้ตั้งค่า($อัลเลน);
ไม่ได้ตั้งค่า($เบลน);
ไม่ได้ตั้งค่า($realnum);
ไม่ได้ตั้งค่า($ctype);
unset($cstep);
return substr($title,$start,$length);
}
ฮ่าๆ ฉันจะโพสต์รหัสเข้ารหัส UTF-8 ในภายหลังด้วย