penyandian php yang berbeda

  1. Penerbit
  2. x64 (alias andi)

penulis skrip pemula tidak peduli tentang hal seperti pengkodean

penulis skrip pemula tidak peduli tentang hal seperti pengkodean. Oleh karena itu, di situs Anda kadang-kadang dapat menemukan kekacauan yang mengerikan, ketika data dari database diperoleh dalam satu pengkodean, halaman dibentuk di yang lain, dan server diberikan yang ketiga. sebagai hasilnya, jika halaman dapat didekripsi, maka setidaknya 2 kali. Jadi, mengapa masalah seperti itu terjadi dan bagaimana cara mengatasinya?

di segmen Rusia paling sering Anda dapat menemukan apa yang disebut windows-encoding. sebut saja berbeda: windows-1251, cp1251 atau bahkan ansi. selanjutnya adalah utf-8. Anda juga dapat menemukan nama unicode, tetapi ini tidak sepenuhnya benar, karena Unicode adalah nama umum untuk seluruh grup (utf-8, utf-16, utf-32). dan kelangkaan yang sangat populer adalah koi8-r atau hanya koi-8 - pengkodean Linux yang dulu populer. Tentu saja, adalah mungkin untuk bertemu sesuatu yang lain di segmen Rusia, tetapi ini agak merupakan "kesenangan" oleh penulis.

Perbedaan utama antara utf-8 dan yang lainnya (terutama windows-1251 dan koi8-r) adalah satu byte terakhir, dan jumlah karakter maksimum yang dapat diwakili menggunakan pengkodean ini dibatasi hingga 256. Tak perlu dikatakan bahwa untuk presentasi lengkap dari teks ini mungkin tidak cukup. dan untuk html solusinya ditemukan - penggunaan yang disebut mnemonik. misalnya:

© - & salin;

Selain fakta bahwa setiap karakter tersebut dijelaskan oleh sekelompok karakter, kode menjadi tidak dapat dibaca dan pekerjaan dengan teks menjadi lebih rumit. Di sinilah multibyte utf-8 datang untuk menyelamatkan. akan sangat mudah untuk menggunakan huruf dengan huruf dan simbol yang berbeda dalam satu teks.

Dengan demikian, set kondisi awal yang paling nyaman adalah sebagai berikut: pengkodean database, skrip php dan halaman html / skrip js harus sama. Tentu saja, Anda dapat menggunakan yang berbeda, tetapi dalam kasus ini ada risiko menjadi bingung. tidak masalah halaman kode mana yang digunakan. jika situs ini hanya untuk pemirsa berbahasa Rusia, windows-1251 akan cukup. jika tidak, utf-8 akan menjadi pilihan logis. opsi pertama kurang lebih jelas. pengkodean multibyte akan membutuhkan beberapa gerakan.

Saat bekerja dengan utf-8, notepad notepad standar tidak akan berfungsi ! Faktanya adalah bahwa editor ini, ketika menyimpan file dalam pengkodean ini, menambahkan tanda tangan ke awal - 3 karakter, yang disebut bom (tanda urutan byte), yang dapat digunakan untuk menentukan pengkodean saat membuka file. lebih baik memilih editor lain: notepad2 atau notepad ++ . dalam pengaturan Anda harus memilih untuk menyimpan tanpa tanda tangan.

Langkah penting berikutnya adalah bekerja dengan database. Sangat diinginkan bahwa pengkodean bidang dasar / tabel / teks cocok dengan pengkodean skrip (bisa cp1251 atau utf-8, atau yang lain). jika data dari database diperoleh dalam bentuk "zyuk", kemungkinan besar pengkodean koneksi berbeda dari data yang disimpan dalam database. Kueri berikut akan membantu mengatasi situasi (jalankan segera setelah terhubung ke database):

jika situs menggunakan windows-1251, Anda harus menentukannya - cp1251.

secara umum, tidak ada yang sulit. hanya saja, fungsi standar php tidak dirancang untuk bekerja dengan string multibyte. tetapi ada perpustakaan standar yang akan membantu memperbaiki situasi: ikonv dan mbstring . untuk ekspresi reguler, ada juga sakelar yang diperlukan yang diaktifkan dengan modifier u .

Nah, data dari database diperoleh, skrip ditulis sesuai dengan semua aturan. Tetap mengirim judul yang benar dan menampilkan kode halaman di browser pengguna. kami mengirim tajuk jadi:

header ('Content-Type: text / html; charset = utf-8');

jika pengodean byte tunggal digunakan, nilai untuk rangkaian karakter akan berbeda - windows-1251 . Setelah itu, masalah seharusnya tidak tetap.

Beberapa contoh sederhana bekerja dengan utf-8 di php:

contoh 1: iconv, jumlah karakter per baris

$ s = 'string'; # string dalam utf-8 $ cnt1 = strlen ($ s); # akan berisi nilai $ 12 cnt2 = iconv_strlen ($ s, 'UTF-8'); # nilai yang benar, 6

contoh 2: mbstring, jumlah karakter dalam sebuah string

$ s = 'string'; # string dalam utf-8 $ cnt1 = strlen ($ s); # akan berisi nilai $ 12 cnt2 = mb_strlen ($ s, 'UTF-8'); # nilai yang benar, 6

contoh 3: ekspresi reguler, cari dan ganti

$ s = 'String'; # baris dalam utf-8 $ s = preg_replace ('/ p / i', 'd', $ s); # penggantian tidak akan terjadi $ s = preg_replace ('/ p / iu', 'd', $ s); # kata dock hasil

modifier i mengatur pencarian case-insensitive, dan modifier u memberitahu mesin ekspresi reguler untuk bekerja dengan utf-8 string.

jika seseorang mengatakan bahwa php tidak dapat bekerja dengan utf-8, itu akan salah. Selama beberapa tahun sekarang saya telah melakukan semua proyek saya dalam pengkodean ini dan tidak ada masalah sama sekali. Mesin pencari sendiri telah lama menggunakan pengkodean yang luar biasa ini.

Penerbit

offline 11 jam

x64 (alias andi)

Komentar: 2846 Publikasi: 395 Pendaftaran: 02-04-2009

Jadi, mengapa masalah seperti itu terjadi dan bagaimana cara mengatasinya?