Catatan. Fungsi ini peka huruf besar-kecil. Gunakan fungsi str_ireplace() untuk melakukan pencarian case-insensitive
Catatan. Fungsi ini aman untuk biner
Sintaksis
str_replace(temukan, ganti, tali, hitung)
Nilai Parameter
ParameterDeskripsitemukanDiperlukan. Menentukan nilai untuk findreplaceRequired. Menentukan nilai untuk mengganti nilai di findstringRequired. Menentukan string yang akan dicari countOptional. Sebuah variabel yang menghitung jumlah penggantianDetail Teknis
Nilai Pengembalian. Mengembalikan string atau array dengan nilai pengganti Versi PHP. 4+Catatan perubahan. Parameter hitungan ditambahkan dalam PHP 5. 0Sebelum PHP4. 3. 3, fungsi ini mengalami masalah saat menggunakan array sebagai parameter temukan dan ganti, yang menyebabkan indeks temukan kosong dilewati tanpa memajukan penunjuk internal pada larik pengganti. Versi yang lebih baru tidak akan mengalami masalah ini
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 pengodean
Pengkodean 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 morse
Kode 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
"Hi" -> Encode("Hi") -> Send("... ..") -> Decode("... ..") -> "Hi"
Sistem ini ditemukan sekitar tahun 1837, dan orang-orang secara manual menyandikan dan mendekodekan pesan-pesan tersebut. Sebagai contoh,
- S dikodekan sebagai. (tiga tanda pendek)
- T sebagai - (satu tanda panjang)
- Ucas. - (dua tanda pendek dan satu tanda panjang)
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)
SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic _
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 karakter
Seperti 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;
Standar
Standar 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
ASCII
ASCII, 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
Komputer 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
75 / 2 = 37 + 1 37 / 2 = 18 + 1 18 / 2 = 9 + 0 9 / 2 = 4 + 1 4 / 2 = 2 + 0 2 / 2 = 1 + 0 1 / 2 = 0 + 1
Sekarang, kami mengekstrak "sisa" dan memasukkannya dalam urutan terbalik
1101001 => 1001011
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
Unicode
Tujuan 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 saat ini. UTF-8
UTF-8
UTF-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
- UTF-8 (dan Unicode) kompatibel dengan ASCII. Ketika UTF-8 dibuat pada tahun 1993, banyak data dalam ASCII, jadi dengan membuat UTF-8 kompatibel dengannya, orang tidak perlu mengubah data sebelum menggunakannya. Pada dasarnya, file dalam ASCII dapat diperlakukan sebagai UTF-8, dan berfungsi dengan baik
- UTF-8 efisien. Saat kami menyimpan atau mengirim karakter melalui komputer, penting agar karakter tersebut tidak memakan terlalu banyak ruang. Siapa yang menginginkan file 1 GB ketika Anda dapat memiliki file 256 MB?
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
11100010 10011010 10100001 _
Kami juga dapat menunjukkan cara kerjanya dengan PHP hanya untuk bersenang-senang
// We first extract the hexadecimal value of a string, like "A" $value = unpack('H*', "A"); // Convert it now from hexadecimal to decimal (just a number) $unicodeValue = base_convert($value[1], 16, 10); // $unicodeValue is 65 // Now we transform it from base 10 (decimal) to base 2 (binary) echo base_convert($unicodeValue, 10, 2); // 1000001
Pengkodean dalam PHP
Sekarang 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 PHP
Seperti 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 PHP
Biasanya ada tiga tempat di mana pengkodean penting dalam suatu program
- File kode sumber untuk program Anda
- Masukan yang Anda terima
- Output yang Anda tampilkan atau simpan dalam database
Mengatur penyandian default yang tepat
Karena 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
default_charset = "UTF-8" _
Apa yang terjadi jika string yang masuk menggunakan penyandian yang berbeda?
Mendeteksi pengodean
Saat 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 SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic 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
mb_detect_encoding($string, 'UTF-8', true); _
Dengan daftar pengkodean potensial, kami dapat mengirimkan string atau larik
mb_detect_encoding($string, "JIS, eucjp-win, sjis-win", true); $array[] = "ASCII"; $array[] = "JIS"; $array[] = "EUC-JP"; mb_detect_encoding($string, $array, true); _
Fungsi ini akan mengembalikan pengkodean karakter yang terdeteksi atau salah jika tidak dapat mendeteksi pengkodean
Konversikan ke penyandian yang berbeda
Setelah 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
// Convert EUC-JP to UTF-8 $string = mb_convert_encoding($stringInEUCJP, "UTF-8", "EUC-JP");
Jika kami ingin mendeteksi pengkodean secara otomatis dari daftar, kami dapat menggunakan yang berikut ini
SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic _0
Kami juga memiliki fungsi lain di PHP yang disebut SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic 6, tetapi karena ini bergantung pada implementasi yang mendasarinya, menggunakan SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic 7 lebih andal dan konsisten
Memeriksa bahwa kami memiliki penyandian yang benar
Sebelum memproses atau menyimpan masukan apa pun, ada baiknya untuk memeriksa apakah kita memiliki string dalam penyandian yang benar. Untuk mencapai ini, kita dapat menggunakan SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic 8, dan itu akan mengembalikan benar atau salah. Misalnya, untuk memeriksa apakah suatu string ada di UTF-8
SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic _1
Keluaran dalam HTML
Karena 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
SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic _2
Catatan tentang database
Basis 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 PHP
Karakter UTF-8 rusak, kemungkinan dikodekan dengan salah
Saat mengubah array menjadi JSON dengan SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic 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
SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic _3
Kesalahan pengkodean dalam database
Saat membaca dari atau menulis ke database, Anda mungkin menemukan beberapa karakter aneh, seperti berikut ini
SOS SOS CQD CQD Titanic. We are sinking fast. Passengers are being put into boats. Titanic _4
Kesalahan 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
Kesimpulan
Pengodean 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.