Apabila membangunkan aplikasi web, kita selalunya perlu menukar antara pengekodan aksara yang berbeza. Dalam PHP, kita boleh menggunakan fungsi iconv()
dan fungsi mb_convert_encoding()
untuk melengkapkan penukaran pengekodan aksara. Walau bagaimanapun, jika kita perlu menukar tatasusunan bait kepada rentetan yang dikodkan GBK, kedua-dua fungsi ini mungkin tidak berfungsi dengan betul.
Dalam artikel ini, kami akan menerangkan cara menukar tatasusunan bait kepada rentetan yang dikodkan GBK menggunakan helah khas dalam PHP. Teknik ini mungkin tidak kelihatan intuitif, tetapi ia sangat berkesan.
Pertama, mari kita lihat kaedah asas mengendalikan tatasusunan bait dalam PHP. Dalam PHP, kita boleh menggunakan fungsi pack()
untuk menukar tatasusunan kepada tatasusunan bait dan fungsi unpack()
untuk menukar tatasusunan bait kepada tatasusunan. Berikut ialah contoh:
$ary = array(0x41, 0x42, 0x43, 0x44); $bin = pack('C*', ...$ary); // $bin = "ABCD" $ary2 = unpack('C*', $bin); // $ary2 = array(1 => 65, 2 => 66, 3 => 67, 4 => 68)
Di sini, kami menggunakan fungsi pack()
untuk menukar tatasusunan yang mengandungi 4 bait kepada rentetan panjang 4 dan gunakan fungsi unpack()
untuk menukar rentetan Ditukar kepada tatasusunan yang mengandungi 4 elemen. Ini adalah contoh yang sangat asas, tetapi pendekatan ini boleh digunakan untuk mengendalikan tatasusunan bait dengan panjang sewenang-wenangnya.
Walau bagaimanapun, anda mungkin menghadapi beberapa kesukaran apabila cuba menukar tatasusunan bait terus kepada rentetan yang dikodkan GBK. Ini kerana pengekodan GBK menggunakan aksara dua bait dan fungsi pack()
hanya boleh mengendalikan aksara bait tunggal. Jadi kita perlu menukar setiap bait dalam tatasusunan bait kepada aksara dalam pengekodan GBK.
Untuk mencapai ini, kita boleh menggunakan fungsi terbina dalam yang lain dalam PHP chr()
. Fungsi ini menukar integer kepada aksara ASCII yang sepadan. Walau bagaimanapun, untuk aksara dwibait dalam pengekodan GBK, kita perlu merawat setiap bait secara khusus. Khususnya, kita perlu menggabungkan satu bait dan bait seterusnya menjadi aksara dua bait, dan kemudian menukar aksara dua bait menjadi rentetan dalam pengekodan GBK. Berikut ialah contoh kod:
function bin2gbk($bin) { $len = strlen($bin); if ($len % 2 != 0) { return false; } $str = ''; for ($i = 0; $i < $len; $i += 2) { $byte1 = ord($bin[$i]); $byte2 = ord($bin[$i+1]); if ($byte1 < 0x81 || $byte1 > 0xfe || $byte2 < 0x40 || $byte2 > 0xfe || $byte2 == 0x7f) { return false; } $char = chr($byte1) . chr($byte2); $str .= iconv('GBK', 'UTF-8', $char); } return $str; }
Fungsi ini mengambil tatasusunan bait dan menukarkannya kepada rentetan yang dikodkan GBK. Khususnya, fungsi terlebih dahulu menyemak sama ada panjang tatasusunan bait adalah genap. Jika tidak, ini bermakna terdapat satu bait dalam tatasusunan bait dan tidak boleh ditukar kepada pengekodan GBK, dan fungsi mengembalikan palsu.
Kami kemudiannya melingkari setiap bait dalam tatasusunan bait, menggabungkannya menjadi aksara dua bait dan menukar aksara dua bait kepada rentetan yang dikodkan GBK. Di sini, kita perlu memberi perhatian kepada dua perkara. Pertama, kita perlu menyemak sama ada setiap bait berada dalam julat pengekodan GBK. Kedua, kita perlu menggunakan fungsi iconv()
untuk menukar aksara dua bait kepada rentetan yang dikodkan GBK. Ini kerana kebanyakan aksara dalam pengekodan GBK bukan aksara ASCII dan memerlukan pengendalian khas.
Akhir sekali, kami mengembalikan rentetan yang dikodkan GBK yang ditukar.
Untuk meringkaskan, menukar tatasusunan bait kepada rentetan yang dikodkan GBK kadangkala sukar. Walau bagaimanapun, menggunakan fungsi pack()
dalam PHP bersama-sama dengan fungsi chr()
, kita boleh menukar setiap bait dalam tatasusunan bait kepada aksara dalam pengekodan GBK dan menggabungkannya menjadi rentetan. Kaedah ini mungkin agak berbelit, tetapi ia sangat berkesan dan boleh menyelesaikan banyak masalah penukaran pengekodan aksara.
Atas ialah kandungan terperinci Bagaimana untuk menukar tatasusunan bait kepada rentetan yang dikodkan GBK dalam php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!