Masalah AJAX dan pengkodean. AJAX dan masalah dengan pengkodean Ajax windows 1251 mengirimkan retakan

16.11.2019 Kartu memori

Selama satu setengah tahun sekarang, postingan tentang kepalsuan masalah pengkodean, dll., telah menjadi debu di draft. AJAX.
Setiap kali pertanyaan serupa muncul di forum, saya ingin memberikan link; setiap kali ada lonjakan kunjungan ke blog untuk pertanyaan “encoding, ajax, masalah,” saya ingin mempublikasikannya, tapi sepertinya bagi saya postingannya belum selesai, saya perlu menambahkan sedikit lagi...
Tapi baru hari ini postingan serupa muncul - ajax, cp1251. Isinya serupa, tetapi maknanya sangat bertolak belakang.
Oleh karena itu, saya memutuskan untuk menghapus draft saya dan mengatakan “kebenaran” saya dalam bentuk kritik terhadap saran fxposter.

Bukan rahasia lagi bahwa pengkodean default untuk data yang diterima melalui Ajax adalah UTF-8.

Ini sebenarnya rahasia. Sebuah rahasia bagi banyak orang. Dan banyak yang tidak mengerti mengapa demikian.
Representasi internal string (dan ekspresi reguler) dalam JavaScript untuk semua rangkaian non-ASCII adalah UTF-8.
Di sinilah yang disebut “masalah” – jika pengkodean tidak ditentukan secara eksplisit dan alfabet non-Latin digunakan, maka akan ditafsirkan sebagai urutan utf-8.

Update 29.11 Udara segar dan David Mzareulyan telah mendinginkan semangat, jadi saya segera mengklarifikasi apa sebenarnya yang akan dibahas di bawah ini.
Jadi - Anda memiliki sumber daya tertentu dalam pengkodean byte tunggal (jangan pergi ke peramal, itu akan menjadi windows-1251) dan Anda khawatir tentang menguasai kata kunci baru yang disebut AJAX. Setelah membaca sedikit, Anda mengambil langkah pertama yang malu-malu ke arah ini dan segera menginjak “baby rake”, dan kemudian, setelah sedikit mengatur napas, bergegas ke forum sambil berteriak minta tolong. Dan mereka akan memberi Anda bantuan ini - kata mereka, buat ulang sumber daya Anda di utf-8... Tentu saja, tentu saja Anda akan mengatakannya dan mengulanginya...
Saya ingin memperingatkan terhadap tindakan gegabah seperti itu.

Solusi standar, yang disarankan oleh semua orang, adalah “gunakan utf-8 dan tidak ada masalah.”

Dan para penasihatnya benar - sebenarnya tidak akan ada masalah.

Lalu lintas akan berlipat ganda. Data yang sama, hasil yang sama, tetapi lalu lintas “dua kali” lebih banyak. Ya?

Apa yang kamu katakan tentang bedak?!?

Jika faktor ini tampaknya tidak penting bagi Anda, maka Anda harus berhenti membaca di sini dan mulai mengerjakan ulang proyek Anda untuk menggunakan UTF-X,
Selebihnya, saya akan meninggalkan beberapa resep yang akan membantu menghindari masalah saat menggunakan pengkodean byte tunggal dalam apa yang disebut. Aplikasi AJAX:

  • Pertama, dan yang terpenting, SELALU tentukan pengkodean konten. Setiap respons server dengan konten teks harus memiliki header Tipe Konten: tipe/Anda; charset=rangkaian karakter Anda.
    Cara termurah untuk melakukan ini adalah dengan menyiapkan server (misalnya di php melalui default_charset)
  • Tentukan rangkaian karakter saat menyertakan javascript di badan dokumen()
  • Harap tentukan rangkaian karakter yang BENAR

    setelah sebelumnya menyetel header yang sesuai – “Tipe Konten: teks/html; rangkaian karakter=cp1251”

    Dalam kasus khusus ini, fxposter adalah pinokio jahatnya sendiri.

    Rangkaian karakter IANA apa pun yang terdaftar dapat digunakan, namun UTF-8 lebih disukai.

    Ya, tidak ada pengkodean dengan nama cp1251 di antara semua yang terdaftar...

Untuk melengkapi gambarannya, saya akan memberikan beberapa masalah bermasalah yang harus Anda hadapi:

  • Jangan izinkan respons AJAX yang berisi karakter non-Latin tetap berada di cache browser (dengan 304 Not Modified, respons akan muncul dari cache, tetapi "beberapa browser" menggunakan utf-8 sebagai rangkaian karakter)
  • Aturan ini terang-terangan digunakan oleh produsen berbagai perpustakaan untuk json_code, tetapi untuk browser (seperti yang kita ketahui sebelumnya), yang utama adalah menentukan pengkodeannya, dan kemudian semuanya akan berantakan.
    Oleh karena itu "masalahnya" - Anda perlu menyandikan data ke JSON secara manual; fungsi perpustakaan umum mengharapkan utf-8 sebagai masukan.

Saya mengharapkan moral dari cerita ini dari Anda di komentar.

Masalah AJAX dan pengkodean

Solusi Perl yang menarik. Pertanyaan dan Jawaban Bagaimana cara mengubah string dari UTF-8 ke Windows-1251?

Setidaknya ada 4 pilihan:

1. Tulis prosedur konversi Anda sendiri.
Dalam hal ini, Anda harus meluangkan waktu untuk mempelajari algoritma.

2. Anda dapat menggunakan modul Convert::Cyrillic, tetapi ini bergantung pada modul Unicode::Map8, yang mudah dipasang di *nix, tetapi mungkin ada masalah dalam menemukan modul di ActiveState Perl 5.8.

3. Anda dapat menggunakan modul Text::Iconv, yang tersedia untuk Perl 5.6 dan Perl 5.8.

$unicodeTextHere saya; # tindakan apa pun yang menyetel variabel # ... # $unicodeTextHere ke teks dalam pengkodean UTF-8 menggunakan Text::Iconv; $converter saya = Teks::Iconv->new("UTF-8", "WINDOWS-1251"); $winTextHere saya = $converter->convert($unicodeTextHere); # $winTextHere berisi teks dalam pengkodean Windows-1251

4. Jika Anda menggunakan Perl 5.8, maka konversi dapat dilakukan menggunakan Encode:

$unicodeTextHere saya; # tindakan apa pun yang menyetel variabel # ... # $unicodeTextHere ke teks dalam pengkodean UTF-8 menggunakan Encode; Encode::from_to($unicodeTextHere, "utf-8", "windows-1251"); # sekarang $unicodeTextHere berisi teks dalam pengkodean Windows-1251

Komentar dari pengunjung situs
Dimitri 25.01.2012 15:46





21/02/15 7.1K

Pengkodean Windows 1251 dibuat pada awal tahun 90an untuk Russification produk perangkat lunak, diproduksi oleh Microsoft Corporation:


Pengkodeannya adalah 8-bit dan mencakup karakter dari kelompok bahasa Slavia, yang meliputi Rusia, Belarusia, Ukraina, Bulgaria, Makedonia, Serbia - ini memberikan keunggulan dibandingkan pengkodean Sirilik lainnya (ISO 8859-5, KOI8-R, CP866) . Namun, pengkodean 1251 juga memiliki kelemahan yang signifikan:
  • 0xFF (25510) adalah kode yang dicadangkan untuk karakter "i". Program yang tidak mendukung bit ke-8 murni sering kali mengalami masalah yang tidak terduga;
  • Tidak ada grafis semu seperti yang ada di KOI8, CP866.

Di bawah ini adalah simbol dari Kode Halaman 1251 atau disingkat CP1251 (angka di bawah simbol adalah kode di sistem heksadesimal karakter yang sama di Unicode):

Pengkodean Windows 1251 dalam html

Seringkali, pengembang web dan blogger dengan berbagai kualifikasi memiliki masalah dengan pengkodean halaman: alih-alih teks yang disiapkan, karakter yang tidak diketahui dan tidak dapat dibaca muncul. Untuk mengatasi masalah ini, Anda perlu memahami esensi dari istilah "pengkodean halaman".

Teks dalam memori komputer disimpan sebagai sejumlah byte tertentu, dan bukan dalam bentuk tampilannya editor teks. Setiap byte adalah kode yang sesuai dengan satu karakter. Agar teks pada halaman dapat ditampilkan dengan benar, Anda perlu memberi tahu browser tabel kode mana yang harus digunakan untuk mendekripsi dan menampilkannya.

Tabel pengkodean tidak universal, yaitu untuk mendekripsi teks Anda harus menggunakan tabel yang sesuai dengan pengkodean karakter:


Agar dokumen HTML dapat ditampilkan dengan benar di browser, Anda harus menentukan pengkodean yang digunakan. Ini dilakukan sebagai berikut:

- antara tag dan tag penutup - berdasarkan baris ini, browser akan menggunakan karakter alfabet Rusia untuk menampilkan teks pada halaman.

Pengkodean Windows 1251 dalam PHP

Bukan rahasia lagi bahwa halaman dihasilkan dengan pengambilan sampel dan menggunakan beberapa bagian dari informasi yang disimpan dalam database. Saat menulis situs web dalam PHP, yang paling sering adalah mysql:


Seringkali, ketika mengganti hosting, masalah muncul: pengkodean informasi yang berbeda dalam database dan templat halaman. Oleh karena itu, satu halaman yang dihasilkan dapat berisi beberapa pengkodean secara bersamaan. Jika informasi di situs disajikan dalam pengkodean Windows 1251, maka pembacaan dari database harus dilakukan menggunakan tabel yang berisi pengkodean Win 1251.

Untuk menyetujui dekripsi, Anda perlu menjalankan fungsi mysql_query("SET NAMES cp1251") - ini berarti konversi dari kode mesin akan dilakukan sesuai dengan tabel cp1251.

Pengkodean Windows 1251 di htaccess

Saat membuat situs web, setelah sebelumnya mengonfigurasi pengkodean dalam templat dan database, masalah tampilan informasi yang salah di browser mungkin masih muncul.

Ketika saya pertama kali mempelajari topik pengembangan situs web, peretasan adalah salah satu masalah saya yang terus-menerus. Saya membuat halaman HTML - krakozyabry di browser, menginstal Denver dan mencoba membuat situs dalam PHP - sekali lagi, bukan huruf krakozyabry. Saya mengunduh tema asing, terhubung ke database - masalah yang sama.

Di website saya, saya biasanya menggunakan UTF-8 (ini adalah pengkodean teks, disebut juga Unicode), sehingga akan ada di semua contoh di artikel ini.

1. UTF-8 tanpa BOM

Mari kita mulai dengan masalah yang paling sederhana. Anda membuat beberapa file HTML, membukanya di browser dan mendapatkan:

Krakozyabry (masalah dengan pengkodean).

Masalahnya relevan terutama untuk pengguna Windows, saya belum pernah menemui hal seperti ini di Mac.

Solusi untuk masalah ini terutama bergantung pada editor yang Anda gunakan. Untuk pengguna Windows, saya merekomendasikan Notepad++ gratis yang mengagumkan.

Jadi, buka file di Notepad++ dan buka Pengkodean > Konversi ke UTF-8 tanpa BOM.

Pertanyaan - kenapa tanpa BOM? Karena dengan BOM Anda akan terus-menerus memasukkan karakter kosong (sebenarnya tidak kosong, mereka juga memiliki fungsinya sendiri, tetapi dalam hal ini kita tidak membutuhkannya) di tempat yang tidak diperlukan, dan untuk PHP ini sudah penting.

2. Kumpulan karakter meta tag

Yang perlu kita lakukan hanyalah menempelkan kode berikut di antara tag situs. Pertama-tama, periksa apakah Anda sudah memiliki meta tag ini. Jika ya, lihat nilai parameter charset.

3.htaccess

Jika huruf Rusia masih ditampilkan sebagai karakter jelek, buka .htaccess Anda, yang ada di root situs dan tempel di sana dengan baris baru Ini:

Penting! Kode ini harus dimasukkan sebelum sesuatu ditampilkan di halaman situs, jika tidak maka akan terjadi kesalahan.

5. Masalah pada karakter terakhir saat memangkas garis

Bagaimana cara mengatasi masalah ini?

Mudah - yang kita butuhkan hanyalah menemukan fungsi substr() dalam kode dan mengubahnya menjadi mb_substr() .

Jika setelah ini Anda mendapatkan kesalahan di situs Anda, kemungkinan besar fungsi multibyte tidak didukung oleh hosting Anda, hal pertama yang harus Anda lakukan adalah menulis ke dukungan dan menanyakan apakah mereka dapat dihubungkan ke akun Anda. Kalau tidak, kita ganti hostingnya, misalnya dengan yang .

6.MySQL

Telah terjadi pada saya lebih dari sekali ketika saya terhubung ke MySQL, mengeluarkan beberapa data, dan ketika ditampilkan di situs, teks tersebut ditampilkan sebagai teks jelek.