Masalah pengkodean bahasa Mandarin dalam pemrograman PHP telah meresahkan banyak orang. Alasan untuk masalah ini sebenarnya sangat sederhana. Setiap negara (atau wilayah) menetapkan kumpulan pengkodean karakter untuk pertukaran informasi komputer, seperti kode ASCII yang diperluas di Amerika Serikat dan. GB2312 di Cina. -80, JIS Jepang, dll. Sebagai dasar pemrosesan informasi di negara/wilayah ini, kumpulan pengkodean karakter memainkan peran penting dalam menyatukan pengkodean. Kumpulan pengkodean karakter dibagi menjadi dua kategori menurut panjangnya: SBCS (kumpulan karakter byte tunggal) dan DBCS (kumpulan karakter byte ganda). Dalam perangkat lunak awal (terutama sistem operasi), untuk menyelesaikan pemrosesan komputer atas informasi karakter lokal, berbagai versi lokal (L10N) muncul untuk membedakannya, konsep seperti LANG dan Codepage diperkenalkan. Namun, karena rentang kode yang tumpang tindih dari berbagai rangkaian karakter lokal, sulit untuk bertukar informasi satu sama lain; biaya pemeliharaan independen untuk setiap versi perangkat lunak yang dilokalkan menjadi tinggi. Oleh karena itu, perlu untuk mengekstrak kesamaan dalam pekerjaan pelokalan dan memprosesnya secara konsisten untuk meminimalkan konten pemrosesan lokalisasi khusus. Ini disebut juga internasionalisasi (118N). Berbagai informasi bahasa selanjutnya distandarisasi sebagai informasi Lokal. Kumpulan karakter dasar yang diproses menjadi Unicode, yang berisi hampir semua mesin terbang.
Saat ini, sebagian besar pemrosesan karakter inti perangkat lunak dengan karakteristik internasional didasarkan pada Unicode. Saat perangkat lunak berjalan, pengaturan pengkodean karakter lokal yang sesuai ditentukan sesuai dengan pengaturan lokal/Lang/Codepage pada saat itu, dan karakter lokal ditentukan. diproses sebagaimana mestinya. Selama pemrosesan, perlu dilakukan konversi timbal balik antara Unicode dan kumpulan karakter lokal, atau bahkan konversi timbal balik antara dua kumpulan karakter lokal yang berbeda dengan Unicode sebagai tengahnya. Metode ini diperluas lebih lanjut dalam lingkungan jaringan, dan informasi karakter apa pun di kedua ujung jaringan juga perlu diubah menjadi konten yang dapat diterima sesuai dengan pengaturan rangkaian karakter.
Masalah pengkodean kumpulan karakter dalam database
Sistem database relasional yang populer semuanya mendukung pengkodean kumpulan karakter database, yang berarti Anda dapat menentukan pengaturan kumpulan karakternya sendiri saat membuat database, dan data database disimpan dalam pengkodean yang ditentukan. Saat aplikasi mengakses data, akan ada konversi pengkodean kumpulan karakter di titik masuk dan keluar. Untuk data berbahasa Mandarin, pengaturan pengkodean karakter database harus memastikan integritas data. GB2312, GBK, UTF-8, dll. semuanya merupakan pengkodean kumpulan karakter database opsional; tentu saja, kita juga dapat memilih ISO8859-1 (8-bit), tetapi kita harus mengonversi karakter Cina 16-bit atau Unicode sebelum
aplikasi
menulis data.Dibagi menjadi dua karakter 8-bit. Setelah membaca data, Anda perlu menggabungkan dua byte dan mengidentifikasi karakter SBCS. Oleh karena itu, kami tidak menyarankan penggunaan ISO8859-1 sebagai pengkodean kumpulan karakter database. Hal ini tidak hanya tidak memanfaatkan sepenuhnya dukungan pengkodean kumpulan karakter dari database itu sendiri, tetapi juga meningkatkan kompleksitas pemrograman. Saat memprogram, Anda dapat terlebih dahulu menggunakan fungsi manajemen yang disediakan oleh sistem manajemen basis data untuk memeriksa apakah data berbahasa Mandarin sudah benar.
Sebelum menanyakan database, program PHP terlebih dahulu mengeksekusi mysql_query("SET NAMES xxxx"); di mana xxxx adalah pengkodean halaman web Anda (charset=xxxx). Jika charset=utf8 di halaman web, maka xxxx=utf8, jika charset =gb2312 di halaman web, Lalu xxxx=gb2312, hampir semua program WEB memiliki kode umum untuk terhubung ke database, yang ditempatkan di file. Di file ini, cukup tambahkan mysql_query("SET NAMES xxxx").
SET NAMES menunjukkan kumpulan karakter apa yang digunakan dalam pernyataan SQL yang dikirim oleh klien. Oleh karena itu, pernyataan SET NAMES 'utf-8' memberitahu server bahwa "informasi masa depan dari klien ini akan menggunakan rangkaian karakter utf-8." Ini juga menentukan kumpulan karakter untuk hasil yang dikirim kembali oleh server ke klien (misalnya, jika Anda menggunakan pernyataan SELECT, ini menunjukkan kumpulan karakter apa yang digunakan untuk nilai kolom).
Teknik yang umum digunakan saat menemukan masalah.
Menemukan masalah penyandian bahasa Mandarin biasanya menggunakan metode paling bodoh dan paling efektif - mencetak kode internal string setelah diproses oleh program yang Anda anggap mencurigakan. Dengan mencetak kode internal sebuah string, Anda dapat mengetahui kapan karakter China dikonversi ke Unicode, kapan Unicode dikonversi kembali ke kode internal China, kapan satu karakter China menjadi dua karakter Unicode, kapan string China dikonversi ke A string dari tanda tanya, kapan bit tingkat tinggi dari string karakter Cina terpotong...
Mengambil sampel string yang sesuai juga dapat membantu membedakan jenis pertanyaan. Misalnya: " aaahaa?@aa " dan string lain yang bergantian antara bahasa Mandarin dan Inggris, serta memiliki karakter karakteristik GB dan GBK. Secara umum, karakter bahasa Inggris tidak akan terdistorsi tidak peduli bagaimana karakter tersebut diubah atau diproses (jika Anda menemukannya, Anda dapat mencoba menambah panjang huruf bahasa Inggris yang berurutan).
Memecahkan masalah kode yang kacau di berbagai aplikasi
1) Gunakan tag untuk mengatur pengkodean halaman.
Fungsi dari tag ini adalah untuk menyatakan set karakter apa yang digunakan browser klien untuk menampilkan halaman.xxx dapat berupa GB2312, GBK, UTF-8 (berbeda dari MySQL, yaitu UTF8) dan seterusnya. Oleh karena itu, sebagian besar halaman dapat menggunakan metode ini untuk memberi tahu browser pengkodean apa yang digunakan saat menampilkan halaman ini, untuk menghindari kesalahan pengkodean dan karakter yang kacau. Namun terkadang kita menemukan bahwa kalimat ini masih tidak berfungsi. Tidak peduli yang mana xxx itu, browser selalu menggunakan pengkodean yang sama. Saya akan membicarakan situasi ini nanti.
Harap dicatat bahwa ini milik informasi HTML dan hanya sebuah pernyataan, yang hanya menunjukkan bahwa server telah meneruskan informasi HTML ke browser.
2) header("content-type:text/html; charset=xxx");
Fungsi dari fungsi ini header() adalah untuk mengirimkan informasi dalam tanda kurung ke header http. Jika isi dalam tanda kurung seperti yang disebutkan dalam artikel, maka fungsinya pada dasarnya sama dengan label. Jika dibandingkan dengan yang pertama, Anda akan menemukan bahwa karakternya mirip. Namun bedanya jika ada fungsi ini maka browser akan selalu menggunakan pengkodean xxx yang Anda minta dan tidak akan pernah membangkang, sehingga fungsi ini sangat berguna. Mengapa ini terjadi? Lalu kita harus membahas perbedaan antara header http dan informasi HTML:
header http adalah string yang dikirim oleh server sebelum mengirimkan informasi HTML ke browser menggunakan protokol http. Tag tersebut milik informasi HTML, sehingga konten yang dikirim oleh header() mencapai browser terlebih dahulu. Poin populernya adalah header() memiliki prioritas lebih tinggi (saya tidak tahu apakah saya bisa mengatakan ini). Jika halaman php memiliki header("content-type:text/html;charset=xxx") dan header("content-type:text/html;charset=xxx"), browser hanya akan mengenali header http sebelumnya dan bukan metanya. Tentu saja fungsi ini hanya dapat digunakan di halaman php.
Masih ada pertanyaan yang tersisa, mengapa yang pertama pasti berfungsi, tetapi yang terakhir terkadang tidak berfungsi? Inilah alasan mengapa kita akan membicarakan Apache selanjutnya.
3) AddDefaultCharset
Di folder conf di direktori root Apache, terdapat seluruh dokumen konfigurasi Apache httpd.conf.
Buka httpd.conf dengan editor teks. Baris 708 (mungkin berbeda di versi berbeda) berisi AddDefaultCharset xxx, di mana xxx adalah nama pengkodean. Arti dari baris kode ini: Atur kumpulan karakter di header http file halaman web di seluruh server ke kumpulan karakter xxx default Anda. Memiliki baris ini sama dengan menambahkan header ("tipe konten: teks/html; charset=xxx") ke setiap file. Sekarang Anda bisa mengerti kenapa browser selalu menggunakan gb2312 meskipun diset ke utf-8.
Jika ada header("content-type:text/html; charset=xxx") di halaman web, kumpulan karakter default akan diubah ke kumpulan karakter yang Anda atur, jadi fungsi ini akan selalu berguna. Jika Anda menambahkan "#" di depan AddDefaultCharset xxx, beri komentar pada kalimat ini, dan halaman tidak berisi header ("tipe konten..."), maka giliran tag meta yang akan diterapkan.
Urutan prioritas di atas tercantum di bawah ini:
.. header("content-type:text/html; charset=xxx")
.. AddDefaultCharset xxx
..
Jika Anda seorang programmer web, disarankan untuk menambahkan header ke masing-masing halaman Anda. ("content-type:text/html;charset=xxx"), ini memastikan bahwa halaman tersebut dapat ditampilkan dengan benar di server mana pun dan memiliki portabilitas yang kuat.
4) Konfigurasi default_charset di php.ini:
default_charset = "gb2312" di php.ini mendefinisikan kumpulan karakter bahasa default php. Biasanya disarankan untuk mengomentari baris ini dan membiarkan browser secara otomatis memilih bahasa berdasarkan rangkaian karakter di header halaman web daripada membuat persyaratan wajib, sehingga layanan web dalam berbagai bahasa dapat disediakan di server yang sama.
Kesimpulan
Faktanya, pengkodean bahasa Mandarin dalam pengembangan PHP tidak serumit yang dibayangkan. Meskipun tidak ada aturan tetap untuk memposisikan dan menyelesaikan masalah, dan berbagai lingkungan operasi juga berbeda, prinsip dasarnya sama. Pemahaman pengetahuan tentang himpunan karakter merupakan dasar dalam memecahkan masalah karakter. Namun, dengan adanya perubahan pada rangkaian karakter bahasa Mandarin, tidak hanya pemrograman PHP, tetapi juga masalah dalam pemrosesan informasi bahasa Mandarin akan tetap ada untuk beberapa waktu.