Setelah Anda melangkah melampaui batas-batas yang nyaman dari rangkaian karakter khusus bahasa Inggris, Anda dengan cepat menemukan diri Anda terjerat dalam dunia UTF-8 yang sangat aneh. Memang, menavigasi melalui masalah terkait UTF-8 bisa menjadi pengalaman yang membuat frustrasi dan menarik. Postingan ini menyediakan buku resep ringkas untuk mengatasi masalah ini saat bekerja dengan PHP dan MySQL khususnya, berdasarkan pengalaman praktis dan pelajaran yang dipetik Show
Membagikan MembagikanSetelah Anda melangkah melampaui batas-batas yang nyaman dari rangkaian karakter khusus bahasa Inggris, Anda dengan cepat menemukan diri Anda terjerat dalam dunia UTF-8 yang sangat aneh. Memang, menavigasi melalui masalah terkait UTF-8 bisa menjadi pengalaman yang membuat frustrasi dan menarik. Postingan ini menyediakan buku resep ringkas untuk mengatasi masalah ini saat bekerja dengan PHP dan MySQL khususnya, berdasarkan pengalaman praktis dan pelajaran yang dipetik Oleh Francisco ClariáPakar Terverifikasi di bidang Teknik Francisco adalah seorang insinyur yang berfokus pada aplikasi lintas platform (Ionic/Cordova) dan berspesialisasi dalam integrasi teknologi perangkat keras-perangkat lunak Proyek PHP Anda mungkin melibatkan banyak data yang berasal dari tempat yang berbeda, seperti database atau API, dan setiap kali Anda perlu memprosesnya, Anda mungkin mengalami masalah penyandian Artikel ini akan membantu Anda bersiap ketika hal itu terjadi dan lebih memahami apa yang terjadi di balik layar Pengantar pengodeanPengkodean adalah inti dari bahasa pemrograman apa pun, dan biasanya, kami menerima begitu saja. Semuanya berfungsi sampai tidak, dan kami mendapatkan kesalahan yang buruk, seperti "Karakter UTF-8 yang salah, mungkin dikodekan dengan salah" Untuk mengetahui mengapa sesuatu dalam pengkodean mungkin tidak berfungsi, pertama-tama kita perlu memahami apa yang dimaksud dengan pengkodean dan cara kerjanya Kode morseKode morse adalah cara yang bagus untuk menjelaskan tentang pengkodean. Ketika dikembangkan, itu adalah pertama kalinya dalam sejarah bahwa pesan dapat dikodekan, dikirim, dan kemudian diterjemahkan dan dipahami oleh penerima. Jika kami menggunakan kode Morse untuk mengirim pesan, pertama-tama kami harus mengubah pesan kami menjadi titik dan garis (juga disebut tanda pendek dan panjang), hanya dua sinyal yang tersedia dalam metode ini. Setelah pesan mencapai tujuannya, penerima harus mengubahnya dari kode Morse ke bahasa Inggris. Ini terlihat seperti ini
Sistem ini ditemukan sekitar tahun 1837, dan orang-orang secara manual menyandikan dan mendekodekan pesan-pesan tersebut. Sebagai contoh,
Berikut pengkodean operator radio dalam kode Morse Di Titanic, kode Morse digunakan untuk mengirim dan menerima pesan, termasuk yang terakhir saat mereka meminta bantuan ("CQD" adalah panggilan darurat) _Dalam penyandian komputer, komputer menyandikan dan mendekodekan karakter dengan cara yang sangat mirip. Satu-satunya perbedaan adalah bahwa alih-alih titik dan garis, kami memiliki satu dan nol dalam kode biner Biner dan karakterSeperti yang mungkin Anda ketahui, komputer hanya memahami kode biner dalam 1 dan 0, jadi tidak ada yang namanya karakter. Ini ditafsirkan oleh perangkat lunak yang Anda gunakan Untuk menyandikan dan mendekodekan karakter menjadi 1 dan 0, kami memerlukan cara standar untuk melakukannya sehingga jika saya mengirimi Anda sekumpulan 1 dan 0, Anda akan menginterpretasikannya (mendekodekannya) dengan cara yang sama seperti saya telah menyandikannya Bayangkan apa yang akan terjadi jika setiap komputer menerjemahkan kode biner menjadi karakter dan sebaliknya dengan caranya sendiri. Jika Anda mengirim pesan ke teman, mereka tidak dapat melihat pesan asli Anda karena, untuk komputer mereka, angka 1 dan 0 Anda akan berarti lain. Inilah mengapa kita perlu menyepakati bagaimana kita mengubah karakter menjadi kode biner dan sebaliknya; StandarStandar pengkodean memiliki sejarah panjang. Kita tidak perlu mendalami sejarahnya di sini, tetapi penting untuk mengetahui dua tonggak penting yang menentukan bagaimana komputer dapat menggunakan penyandian, terutama dengan lahirnya Internet ASCIIASCII, dikembangkan pada tahun 1963, adalah salah satu standar pertama dan terpenting, dan masih digunakan (kami akan menjelaskannya nanti). ASCII adalah singkatan dari American Standard Code for Information Interchange. Bagian "Amerika" sangat relevan karena hanya dapat menyandikan 127 karakter pada versi pertamanya, termasuk abjad Inggris dan beberapa simbol dasar, seperti "?" Berikut tabel lengkapnya SumberKomputer tidak bisa benar-benar menggunakan angka. Seperti yang telah kita ketahui, komputer hanya memahami kode biner, 1s dan 0s, sehingga nilai-nilai ini kemudian dikodekan menjadi biner. Misalnya, "K" adalah 75 di ASCII, jadi kita bisa mengubahnya menjadi biner dengan membagi 75 dengan 2 dan terus berlanjut sampai kita mendapatkan 0. Jika pembagiannya tidak tepat, kita tambahkan 1 sebagai sisa
Sekarang, kami mengekstrak "sisa" dan memasukkannya dalam urutan terbalik
Jadi, di ASCII, "K" dikodekan sebagai 1001011 dalam biner Masalah utama dengan ASCII adalah tidak mencakup bahasa lain. Jika Anda ingin menggunakan komputer Anda dalam bahasa Rusia atau Jepang, Anda memerlukan standar penyandian yang berbeda, yang tidak kompatibel dengan ASCII Pernahkah Anda melihat simbol seperti "???" . Program mencoba untuk menginterpretasikan karakter menggunakan satu metode pengkodean, tetapi mereka tidak mewakili sesuatu yang berarti karena dibuat dengan metode pengkodean lain. Inilah mengapa kami membutuhkan terobosan besar kedua kami, Unicode dan UTF-8 UnicodeTujuan pengembangan Unicode adalah memiliki cara unik untuk mengubah karakter atau simbol apa pun dalam bahasa apa pun di dunia menjadi angka unik, tidak lebih. Jika Anda pergi ke unicode. org, Anda dapat mencari nomor karakter apa pun, termasuk emoji Misalnya, "A" adalah 65, "Y" adalah 121, dan 🍐 adalah 127824 Masalahnya adalah komputer hanya dapat menyimpan dan menangani kode biner, jadi kita masih perlu mengubah angka-angka ini. Berbagai sistem pengkodean dapat mencapai prestasi ini, tetapi kami akan fokus pada yang paling umum hari ini. UTF-8 UTF-8UTF-8 membuat standar Unicode dapat digunakan dengan memberi kami cara yang efisien untuk mengubah angka menjadi kode biner. Dalam banyak kasus, ini adalah penyandian default untuk banyak bahasa pemrograman dan situs web karena dua alasan penting
Mari jelajahi cara kerja UTF-8 sedikit lebih jauh dan mengapa panjangnya berbeda tergantung pada karakter yang dikodekan Bagaimana UTF-8 efisien?UTF-8 menyimpan angka secara dinamis. Yang pertama dalam daftar Unicode mengambil 1 byte, tetapi yang terakhir dapat memakan waktu hingga 4 byte, jadi jika Anda berurusan dengan file bahasa Inggris, sebagian besar karakter kemungkinan hanya mengambil 1 byte, sama seperti di ASCII Ini bekerja dengan mencakup rentang yang berbeda dalam spektrum Unicode dengan jumlah byte yang berbeda Misalnya, untuk menyandikan karakter apa pun dalam tabel ASCII asli (dari 0 hingga 127 dalam desimal), kita hanya memerlukan 7 bit karena 2^7 = 128. Oleh karena itu, kami dapat menyimpan semuanya dalam 1 byte 8 bit, dan kami masih memiliki satu bit gratis Untuk rentang berikutnya (dari 128 hingga 2047), kita memerlukan 11 bit karena 2^11 = 2.048, yaitu 2 byte dalam UTF-8, dengan beberapa bit permanen untuk memberi kita beberapa petunjuk. Mari kita lihat tabel selengkapnya, dan Anda akan mengerti maksud saya Saat membaca 1 dan 0 di komputer, kita tidak memiliki konsep ruang di antara keduanya, jadi kita memerlukan cara untuk mengatakan, "ini dia nilai seperti ini", atau "baca x bit sekarang". Di UTF-8, kami mencapai ini dengan menempatkan beberapa 1 dan 0 secara strategis Jika Anda seorang komputer dan membaca sesuatu yang dimulai dengan 0 di UTF-8, Anda tahu bahwa Anda hanya perlu membaca 1 byte dan menampilkan karakter yang tepat dari Unicode dalam kisaran 0-127 Jika Anda menemukan dua 1 bersamaan, itu berarti Anda perlu membaca dua byte, dan Anda berada di kisaran 128-2,047. Tiga 1 bersamaan berarti Anda perlu membaca tiga byte Mari kita lihat beberapa contoh Sebuah karakter (seperti "A") diterjemahkan menjadi angka menurut tabel Unicode raksasa ("65"). Kemudian, UTF-8 mengubah angka ini menjadi kode biner (01000001) mengikuti pola yang kami tunjukkan Jika kita memiliki karakter dalam rentang yang lebih tinggi, seperti emoji "⚡", yaitu 9889 menurut Unicode, kita memerlukan 3 byte _Kami juga dapat menunjukkan cara kerjanya dengan PHP hanya untuk bersenang-senang
Pengkodean dalam PHPSekarang kita telah melihat bagaimana pengkodean bekerja secara umum, kita dapat fokus pada bagian-bagian penting yang biasanya perlu kita tangani di PHP Catatan singkat tentang versi PHPSeperti yang mungkin Anda ketahui, PHP memiliki reputasi buruk selama beberapa waktu. Namun, untungnya, banyak kekurangan aslinya telah diperbaiki di versi yang lebih baru (dari 5. X). Oleh karena itu, saya sarankan Anda menggunakan versi paling modern yang Anda bisa untuk mencegah masalah yang tidak terduga Di mana pengkodean penting dalam PHPBiasanya ada tiga tempat di mana pengkodean penting dalam suatu program
Mengatur penyandian default yang tepatKarena UTF-8 sangat universal, ada baiknya untuk menetapkannya sebagai penyandian default untuk PHP. Encoding ini disetel secara default, tetapi jika seseorang telah mengubah setelan ini, berikut cara melakukannya. Buka php.ini Anda. ini dan tambahkan (atau perbarui) baris berikut _Apa yang terjadi jika string yang masuk menggunakan penyandian yang berbeda? Mendeteksi pengodeanSaat kami menerima string dari membaca file, misalnya, atau di database, kami tidak mengetahui pengkodeannya, jadi langkah pertama adalah mendeteksinya Mendeteksi pengkodean tertentu tidak selalu memungkinkan, tetapi kami memiliki peluang bagus dengan 5. Untuk menggunakannya, kita perlu meneruskan string, daftar pengkodean valid yang ingin Anda deteksi, dan apakah Anda menginginkan perbandingan yang ketat (disarankan dalam banyak kasus)Berikut adalah contoh cara untuk menentukan apakah suatu string ada di UTF-8 _Dengan daftar pengkodean potensial, kami dapat mengirimkan string atau larik _Fungsi ini akan mengembalikan pengkodean karakter yang terdeteksi atau salah jika tidak dapat mendeteksi pengkodean Konversikan ke penyandian yang berbedaSetelah jelas penyandian mana yang sedang kita hadapi, langkah selanjutnya adalah mengubahnya menjadi penyandian default kita, biasanya UTF-8. Sekarang, ini tidak selalu memungkinkan karena beberapa penyandian tidak kompatibel, tetapi kita dapat mencoba pendekatan berikut
Jika kami ingin mendeteksi pengkodean secara otomatis dari daftar, kami dapat menggunakan yang berikut ini _0Kami juga memiliki fungsi lain di PHP yang disebut 6, tetapi karena ini bergantung pada implementasi yang mendasarinya, menggunakan 7 lebih andal dan konsistenMemeriksa bahwa kami memiliki penyandian yang benarSebelum memproses atau menyimpan masukan apa pun, ada baiknya untuk memeriksa apakah kita memiliki string dalam penyandian yang benar. Untuk mencapai ini, kita dapat menggunakan 8, dan itu akan mengembalikan benar atau salah. Misalnya, untuk memeriksa apakah suatu string ada di UTF-8 _1Keluaran dalam HTMLKarena sangat umum untuk merender beberapa kode HTML untuk situs web dari PHP, inilah cara kami memastikan bahwa kami menyetel penyandian yang tepat untuk browser. Kita bisa melakukannya hanya dengan mengirimkan header sebelum output _2Catatan tentang databaseBasis data adalah bagian penting dalam menangani penyandian dengan benar karena basis data dikonfigurasi untuk menggunakan satu untuk semua data yang kita miliki di sana Dalam banyak kasus, mereka adalah tempat kami akan menyimpan semua string kami dan dari mana kami akan membacanya untuk menunjukkannya kepada pengguna Saya sarankan Anda memastikan bahwa pengkodean yang Anda gunakan untuk proyek Anda juga sama dengan yang Anda atur di database Anda untuk mencegah masalah di masa mendatang Mengatur penyandian Anda untuk database bergantung pada sistem database yang Anda gunakan, jadi kami tidak dapat menjelaskan semuanya dalam artikel ini. Namun, masuk akal untuk membuka dokumen online dan melihat bagaimana kami dapat mengubahnya. Misalnya, inilah cara melakukannya dengan PostgreSQL dan dengan MySQL Kesalahan umum terkait penyandian dalam PHPKarakter UTF-8 rusak, kemungkinan dikodekan dengan salahSaat mengubah array menjadi JSON dengan 9, Anda mungkin mengalami masalah ini. Ini hanya berarti bahwa apa yang diharapkan PHP sebagai UTF-8 tidak ada dalam penyandian itu, jadi kita dapat menyelesaikan masalah dengan mengonversinya terlebih dahulu _3Kesalahan pengkodean dalam databaseSaat membaca dari atau menulis ke database, Anda mungkin menemukan beberapa karakter aneh, seperti berikut ini _4Kesalahan ini biasanya merupakan tanda bahwa pengkodean yang Anda gunakan untuk membaca string Anda tidak sama dengan yang digunakan database. Untuk memperbaiki masalah ini, pastikan Anda memeriksa pengkodean string sebelum menyimpannya dan Anda telah menyetel pengkodean yang benar di database Anda KesimpulanPengodean terkadang sulit dipahami, tetapi semoga dengan artikel ini, ini sedikit lebih jelas, dan Anda merasa lebih siap untuk memperbaiki kesalahan apa pun yang mungkin menghadang Anda Pelajaran paling penting untuk diambil adalah untuk selalu ingat bahwa semua string memiliki pengkodean terkait, jadi pastikan Anda menggunakan yang benar sejak pertama kali Anda menemukannya, dan gunakan pengkodean yang sama di seluruh proyek Anda, termasuk database . Jika Anda perlu memilih satu, pilih yang modern dan umum, seperti UTF-8, karena ini akan membantu Anda dengan baik dengan karakter baru apa pun yang mungkin muncul di masa mendatang, dan dirancang dengan sangat baik. Bagaimana cara mengubah ASCII ke UTFJika kita mengetahui bahwa penyandian saat ini adalah ASCII, fungsi 'iconv' dapat digunakan untuk mengonversi ASCII ke UTF-8 . String asli dapat diteruskan sebagai parameter ke fungsi iconv untuk menyandikannya ke UTF-8.
Cara mengonversi karakter khusus ke UTFFungsi utf8_encode() adalah fungsi bawaan dalam PHP yang digunakan untuk menyandikan string ISO-8859-1 ke UTF-8. Unicode telah dikembangkan untuk mendeskripsikan semua kemungkinan karakter dari semua bahasa dan menyertakan banyak simbol dengan satu nomor unik untuk setiap simbol/karakter.
Bisakah Anda mendekode ASCII dengan UTFItu dirancang untuk kompatibilitas mundur dengan ASCII . 128 karakter pertama Unicode, yang sesuai satu-ke-satu dengan ASCII, dikodekan menggunakan satu byte dengan nilai biner yang sama dengan ASCII, sehingga teks ASCII yang valid juga merupakan Unicode yang dikodekan UTF-8 yang valid.
Bagaimana cara mengubah nilai ASCII menjadi karakter di PHP?Fungsi PHP chr()
. Nilai ASCII dapat ditentukan dalam nilai desimal, oktal, atau hex. |