Cara menampilkan karakter utf-8 di php

Paul Tero adalah pengembang web lepas, tinggal dan bekerja di Brighton, Inggris. Dia memiliki pengalaman lebih dari 20 tahun di berbagai proyek dan platform. Lebih lanjut tentang Paul ↬

Buletin Email

Email (menghancurkan) Anda

Kiat mingguan tentang front-end & UX
Dipercaya oleh 200.000+ orang

  • Cara menampilkan karakter utf-8 di php
    Prinsip Universal Tipografi dengan Elliot Jay Stocks

  • Cara menampilkan karakter utf-8 di php
    Bersiaplah untuk peran komunikasi hari ini MS Northwestern dalam Desain Informasi
  • Cara menampilkan karakter utf-8 di php
    Pelatihan UX Pola Desain Antarmuka

  • Cara menampilkan karakter utf-8 di php
    Daftar Periksa Desain Antarmuka Cerdas

  • Cara menampilkan karakter utf-8 di php
    Front-End SmashingConf 2023

Artikel ini sangat bergantung pada angka dan bertujuan untuk memberikan pemahaman tentang himpunan karakter, Unicode, UTF-8 dan berbagai masalah yang dapat muncul

Ini adalah kisah yang berasal dari hari-hari awal komputer. Ceritanya punya plot, yah, semacam itu. Ini memiliki persaingan dan intrik, serta melintasi banyak sekali negara dan bahasa. Ada konflik dan resolusi, dan akhir yang bahagia. Tapi fokus utamanya adalah karakter. 110.116 dari mereka. Di akhir cerita, mereka semua akan menemukan tempat unik mereka sendiri di dunia ini

Artikel ini akan mengikuti beberapa karakter tersebut secara lebih dekat, saat mereka melakukan perjalanan dari server Web ke browser, dan kembali lagi. Sepanjang jalan, Anda akan mengetahui lebih banyak tentang sejarah karakter, rangkaian karakter, Unicode dan UTF-8, dan mengapa tanda tanya dan karakter beraksen aneh terkadang muncul di database dan file teks

Peringatan. Artikel ini berisi banyak angka, termasuk sedikit biner — paling baik didekati setelah secangkir kopi pagi Anda

ASCII

Komputer hanya berurusan dengan angka dan bukan huruf, jadi penting bagi semua komputer untuk menyetujui angka mana yang mewakili huruf mana

Katakanlah komputer saya menggunakan angka 1 untuk A, 2 untuk B, 3 untuk C, dst dan komputer Anda menggunakan 0 untuk A, 1 untuk B, dst. Jika saya mengirimi Anda pesan HELLO, maka angka 8, 5, 12, 12, 15 akan melintas di kabel. Tetapi untuk Anda 8 berarti saya, jadi Anda akan menerima dan mendekodekannya sebagai IFMMP. Untuk berkomunikasi secara efektif, kita perlu menyepakati cara standar pengkodean karakter

Untuk tujuan ini, pada tahun 1960 American Standards Association menciptakan pengkodean 7-bit yang disebut American Standard Code for Information Interchange (ASCII). Dalam pengkodean ini HELLO adalah 72, 69, 76, 76, 79 dan akan ditransmisikan secara digital sebagai 1001000 1000101 1001100 1001100 1001111. Menggunakan 7 bit memberikan 128 nilai yang mungkin dari 0000000 hingga 1111111, jadi ASCII memiliki cukup ruang untuk semua huruf Latin huruf kecil dan huruf besar, bersama dengan setiap digit numerik, tanda baca umum, spasi, tab, dan karakter kontrol lainnya. Pada tahun 1968, — semua komputer harus menggunakan dan memahami ASCII

Mencobanya Sendiri

Ada banyak tabel ASCII yang tersedia, menampilkan atau mendeskripsikan 128 karakter. Atau Anda dapat membuatnya sendiri dengan sedikit CSS, HTML, dan Javascript, sebagian besar untuk membuatnya ditampilkan dengan baik

<html>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<script type="text/javascript">
for (var i=0; i<128; i++) document.writeln ((i%32?’:'<p>') + i + ': ' + String.fromCharCode (i) + '<br>');
</script>
</body>
</html>

Ini akan menampilkan tabel seperti ini

Cara menampilkan karakter utf-8 di php

Tabel ASCII Javascript Do-It-Yourself dilihat di Firefox

Bagian terpenting dari ini adalah fungsi Javascript String.fromCharCode. Dibutuhkan nomor dan mengubahnya menjadi karakter. Faktanya, empat baris HTML dan Javascript berikut semuanya menghasilkan hasil yang sama. Mereka semua mendapatkan browser untuk menampilkan nomor karakter 72, 69, 76, 76 dan 79

HELLO
HELLO
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>
_

Perhatikan juga bagaimana Firefox menampilkan karakter yang tidak dapat dicetak (seperti backspace dan escape) di kolom pertama. Beberapa browser menampilkan tanda kosong atau tanda tanya. Firefox meremas empat digit heksadesimal ke dalam kotak kecil

Lebih banyak setelah melompat. Lanjutkan membaca di bawah ↓

Formulir web adalah pusat dari setiap interaksi yang bermakna, jadi mereka layak untuk ditangani dengan tegas. Temui Pola Desain Formulir Adam Silver, panduan praktis untuk mendesain dan membuat formulir untuk web

Lompat ke daftar isi ↬

Cara menampilkan karakter utf-8 di php

Bit Kedelapan

Teleprinter dan ticker saham cukup senang mengirimkan 7 bit informasi satu sama lain. Tapi model baru tahun 1970-an lebih suka bekerja dengan kekuatan 2. Mereka dapat memproses 8 bit sekaligus dan menggunakan 8 bit (alias byte atau oktet) untuk menyimpan setiap karakter, memberikan 256 nilai yang mungkin

Karakter 8 bit dapat menyimpan angka hingga 255, tetapi ASCII hanya menetapkan hingga 127. Nilai lainnya dari 128 hingga 255 adalah cadangan. Awalnya, PC IBM menggunakan slot cadangan untuk mewakili huruf beraksen, berbagai simbol dan bentuk, serta beberapa huruf Yunani. Misalnya, angka 200 adalah pojok kiri bawah sebuah kotak. ╚, dan 224 adalah huruf Yunani alpha dalam huruf kecil. α. Cara penyandian huruf ini kemudian diberi kode nama halaman 437

Namun, tidak seperti ASCII, karakter 128-255 tidak pernah dibakukan, dan berbagai negara mulai menggunakan slot cadangan untuk abjad mereka sendiri. Tidak semua orang setuju bahwa 224 harus menampilkan α, bahkan orang Yunani pun tidak. Hal ini menyebabkan terciptanya segelintir yang baru. Misalnya, di komputer IBM Rusia menggunakan kode halaman 885, 224 mewakili huruf CyrillicЯ. Dan dalam kode Yunani halaman 737, itu adalah omega huruf kecil. ω

Bahkan kemudian ada perbedaan pendapat. Dari tahun 1980-an Microsoft Windows memperkenalkan halaman kodenya sendiri. Di halaman kode Cyrillic Windows-1251, 224 mewakili huruf Cyrillic a, danЯ berada di 223

Pada akhir 1990-an, upaya standardisasi dilakukan. Lima belas set karakter 8 bit yang berbeda dibuat untuk mencakup banyak huruf yang berbeda seperti Sirilik, Arab, Ibrani, Turki, dan Thailand. Mereka disebut ISO-8859-1 hingga ISO-8859-16 (nomor 12 ditinggalkan). Dalam Cyrillic ISO-8859-5, 224 mewakili huruf р, dan Я ada di 207

Jadi jika seorang teman Rusia mengirimi Anda dokumen, Anda benar-benar perlu mengetahui halaman kode apa yang digunakannya. Dokumen itu sendiri hanyalah urutan angka. Karakter 224 bisa jadi Я, a atau р. Dilihat menggunakan halaman kode yang salah, akan terlihat seperti sekumpulan huruf dan simbol yang diacak

(Situasinya tidak seburuk saat melihat halaman Web — karena browser Web biasanya dapat mendeteksi kumpulan karakter halaman berdasarkan analisis frekuensi dan teknik serupa lainnya. Tapi ini adalah rasa aman yang salah - mereka bisa dan memang salah. )

Mencobanya Sendiri

Halaman kode juga dikenal sebagai kumpulan karakter. Anda dapat menjelajahi kumpulan karakter ini sendiri, tetapi kali ini Anda harus menggunakan PHP atau bahasa sisi server yang serupa (kira-kira karena karakter harus ada di halaman sebelum masuk ke browser). Simpan baris ini dalam file PHP dan unggah ke server Anda

<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php for ($i=0; $i<256; $i++) echo ($i%32?’:'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>

Ini akan menampilkan tabel seperti ini

Cara menampilkan karakter utf-8 di php

Set karakter Cyrillic ISO-8859-5 dilihat di Firefox

Fungsi PHP chr melakukan hal yang mirip dengan String.fromCharCode Javascript. Misalnya

HELLO
HELLO
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>
_1 menyematkan nomor 224 ke halaman Web sebelum mengirimkannya ke browser. Seperti yang telah kita lihat di atas, 224 dapat berarti banyak hal yang berbeda. Jadi, browser perlu mengetahui set karakter mana yang digunakan untuk menampilkan 224. Untuk itulah baris pertama di atas. Ini memberi tahu browser untuk menggunakan set karakter Cyrillic ISO-8858-5

<meta charset="ISO-8859-5">
_

Jika Anda mengecualikan baris

HELLO
HELLO
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>
_2, baris tersebut akan ditampilkan menggunakan default browser. Di negara-negara dengan huruf berbasis Latin (seperti Inggris dan AS), ini mungkin ISO-8859-1, dalam hal ini 224 adalah a dengan aksen serius. sebuah. Coba ubah baris ini ke ISO-8859-7 atau Windows-1251 dan segarkan halaman. Anda juga dapat mengganti set karakter di browser. Di Firefox buka View > Character Encoding. Tukar di antara beberapa untuk melihat apa efeknya. Jika Anda mencoba menampilkan lebih dari 256 karakter, urutan akan berulang

Ringkasan Sekitar tahun 1990

Ini adalah situasi di sekitar tahun 1990. Dokumen dapat ditulis, disimpan, dan dipertukarkan dalam banyak bahasa, tetapi Anda perlu mengetahui rangkaian karakter yang mereka gunakan. Juga tidak ada cara mudah untuk menggunakan dua atau lebih huruf non-Inggris dalam dokumen yang sama, dan huruf dengan lebih dari 256 karakter seperti bahasa Cina dan Jepang harus menggunakan sistem yang sama sekali berbeda.

Akhirnya, Internet akan datang. Internasionalisasi dan globalisasi akan menjadikan ini masalah yang jauh lebih besar. Diperlukan standar baru

Unicode Untuk Penyelamatan

Dimulai pada akhir 1980-an, sebuah standar baru diusulkan - yang akan menetapkan nomor unik (secara resmi dikenal sebagai titik kode) untuk setiap huruf dalam setiap bahasa, yang akan memiliki lebih dari 256 slot. Itu disebut Unicode. Sekarang dalam versi 6. 1 dan terdiri dari lebih dari 110.000 poin kode. Jika Anda memiliki waktu luang beberapa jam, Anda dapat menonton semuanya berlalu dengan cepat

128 poin kode Unicode pertama sama dengan ASCII. Kisaran 128-255 berisi simbol mata uang dan tanda umum lainnya serta karakter beraksen (alias karakter dengan tanda diakritik), dan sebagian besar dipinjam ISO-8859-1. Setelah 256 masih banyak lagi karakter beraksen. Setelah tahun 880 itu menjadi huruf Yunani, kemudian aksara Sirilik, Ibrani, Arab, Indik, dan Thailand. Cina, Jepang, dan Korea dimulai dari tahun 11904 dengan banyak lainnya di antaranya

Ini bagus – tidak ada lagi ambiguitas – setiap huruf diwakili oleh nomor uniknya sendiri. Cyrillic Я selalu 1071 dan Yunani α selalu 945. 224 selalu à, dan H tetap 72. Perhatikan bahwa poin kode Unicode ini secara resmi ditulis dalam heksadesimal yang didahului oleh U+. Jadi titik kode Unicode H biasanya ditulis sebagai U+0048 daripada 72 (untuk mengonversi dari heksadesimal ke desimal. 4*16+8=72)

Masalah utamanya adalah jumlahnya lebih dari 256. Karakter tidak lagi sesuai dengan 8 bit. Namun Unicode bukanlah rangkaian karakter atau halaman kode. Jadi secara resmi itu bukan masalah Konsorsium Unicode. Mereka baru saja mendapatkan ide dan meninggalkan orang lain untuk memilah implementasinya. Itu akan dibahas dalam dua bagian berikutnya

Unicode Di Dalam Peramban

Unicode tidak cocok dengan 8 bit, bahkan 16 bit. Meskipun hanya 110.116 titik kode yang digunakan, ia memiliki kemampuan untuk mendefinisikan hingga 1.114.112 titik kode, yang membutuhkan 21 bit.

Namun, komputer telah maju sejak tahun 1970-an. Mikroprosesor 8 bit agak ketinggalan zaman. Komputer baru sekarang memiliki prosesor 64 bit, jadi mengapa kita tidak bisa beralih dari karakter 8 bit ke karakter 32 bit atau 64 bit?

Jawaban pertama adalah. kita dapat

Banyak perangkat lunak ditulis dalam C atau C++, yang mendukung "karakter luas". Ini adalah karakter 32 bit yang disebut

HELLO
HELLO
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>
3. Ini adalah perpanjangan dari tipe
HELLO
HELLO
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>
4 C 8 bit. Secara internal, browser Web modern menggunakan karakter lebar ini (atau yang serupa) dan secara teoritis dapat dengan senang hati menangani lebih dari 4 miliar karakter berbeda. Ini banyak untuk Unicode. Jadi — secara internal, browser Web modern menggunakan Unicode

Mencobanya Sendiri

Kode Javascript di bawah ini mirip dengan kode ASCII di atas, kecuali naik ke angka yang jauh lebih tinggi. Untuk setiap angka, ini memberi tahu browser untuk menampilkan titik kode Unicode yang sesuai

<html>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<script type="text/javascript">
for (var i=0; i<2096; i++)
  document.writeln ((i%256?’:'<p>') + i + ': ' + String.fromCharCode (i) + '<br>');
</script>
</body>
</html>
_

Ini akan menampilkan tabel seperti ini

Cara menampilkan karakter utf-8 di php

Pilihan poin kode Unicode dilihat di Firefox

Tangkapan layar di atas hanya menunjukkan sebagian dari beberapa ribu poin kode pertama yang dihasilkan oleh Javascript. Pilihan mencakup beberapa karakter Sirilik dan Arab, yang ditampilkan dari kanan ke kiri

Poin penting di sini adalah bahwa Javascript berjalan sepenuhnya di browser Web di mana karakter 32 bit dapat diterima dengan sempurna. Fungsi Javascript

HELLO
HELLO
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>
_5 menampilkan titik kode Unicode 1071 yang merupakan huruf Я

Demikian pula jika Anda meletakkan entitas HTML

HELLO
HELLO
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>
_6 ke dalam halaman HTML, browser Web modern akan menampilkan Я. Entitas HTML numerik juga mengacu pada Unicode

Di sisi lain, fungsi PHP

HELLO
HELLO
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>
_7 akan menghasilkan garis miring / karena fungsi chr hanya menangani 8 angka bit hingga 256 dan berulang setelah itu, dan 1071%256=47 yang telah menjadi / sejak tahun 1960-an

UTF-8 Untuk Penyelamatan

Jadi jika browser dapat menangani Unicode dalam karakter 32 bit, di mana masalahnya?

Masalahnya tetap karena

  1. Banyak perangkat lunak dan protokol yang ada mengirim/menerima dan membaca/menulis karakter 8 bit
  2. Menggunakan 32 bit untuk mengirim/menyimpan teks bahasa Inggris akan melipatgandakan jumlah bandwidth/ruang yang diperlukan

Meskipun browser dapat menangani Unicode secara internal, Anda masih harus mendapatkan data dari server Web ke browser Web dan kembali lagi, dan Anda perlu menyimpannya di file atau database di suatu tempat. Jadi, Anda masih memerlukan cara untuk memasukkan 110.000 poin kode Unicode ke dalam hanya 8 bit

Ada beberapa upaya untuk mengatasi masalah ini seperti UCS2 dan UTF-16. Tetapi pemenang dalam beberapa tahun terakhir adalah UTF-8, yang merupakan singkatan dari Universal Character Set Transformation Format 8 bit

UTF-8 pintar. Ini bekerja sedikit seperti tombol Shift pada keyboard Anda. Biasanya ketika Anda menekan H pada keyboard Anda, huruf kecil “h” muncul di layar. Tetapi jika Anda menekan Shift terlebih dahulu, huruf kapital H akan muncul

UTF-8 memperlakukan angka 0-127 sebagai ASCII, 192-247 sebagai tombol Shift, dan 128-192 sebagai tombol yang akan digeser. Misalnya, karakter 208 dan 209 menggeser Anda ke rentang Cyrillic. adalah karakter 1071, Cyrillic Я. Hasilnya adalah (208%32)*64 + (175%64) = 1071. Karakter 224-239 seperti pergeseran ganda. 226 diikuti oleh 190 dan kemudian 128 adalah karakter 12160. ⾀. 240 dan lebih adalah shift tiga kali lipat

Oleh karena itu UTF-8 adalah pengkodean lebar variabel multi-byte. Multi-byte karena satu karakter seperti Я membutuhkan lebih dari satu byte untuk menentukannya. Lebar variabel karena beberapa karakter seperti H hanya membutuhkan 1 byte dan beberapa hingga 4

Terbaik dari semua itu kompatibel dengan ASCII. Tidak seperti beberapa solusi yang diusulkan lainnya, dokumen apa pun yang ditulis hanya dalam ASCII, hanya menggunakan karakter 0-127, juga merupakan UTF-8 yang valid — yang menghemat bandwidth dan kerumitan

Mencobanya Sendiri

Ini adalah percobaan yang berbeda. PHP menyematkan 6 angka yang disebutkan di atas ke dalam halaman HTML. 72, 208, 175, 226, 190, 128. Browser mengartikan angka-angka itu sebagai UTF-8, dan secara internal mengubahnya menjadi poin kode Unicode. Kemudian Javascript menampilkan nilai Unicode. Coba ubah set karakter dari UTF-8 ke ISO-8859-1 dan lihat apa yang terjadi

<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<p>Characters embedded in the page:<br>
<span id="chars"><?php echo chr(72).chr(208).chr(175).chr(226).chr(190).chr(128); ?></span>
<p>Character values according to Javascript:<br>
<script type="text/javascript">
function ShowCharacters (s) {var r=’; for (var i=0; i<s.length; i++)
  r += s.charCodeAt (i) + ': ' + s.substr (i, 1) + '<br>'; return r;}
document.writeln (ShowCharacters (document.getElementById('chars').innerHTML));
</script>
</body>
</html>

Jika Anda sedang terburu-buru, ini akan terlihat seperti ini

Cara menampilkan karakter utf-8 di php

Urutan angka di atas ditampilkan menggunakan set karakter UTF-8

Cara menampilkan karakter utf-8 di php

Urutan angka yang sama ditampilkan menggunakan rangkaian karakter ISO-8859-1

Jika Anda menampilkan halaman menggunakan kumpulan karakter UTF-8, Anda hanya akan melihat 3 karakter. HЯ⾀. Jika Anda menampilkannya menggunakan set karakter ISO-8859-1, Anda akan melihat enam karakter terpisah. HЯ⾀. Inilah yang sedang terjadi

  1. Di server Web Anda, PHP menyematkan angka 72, 208, 175, 226, 190, dan 128 ke dalam halaman Web
  2. Halaman Web melesat melintasi Internet dari server Web ke browser Web Anda
  3. Browser menerima angka-angka itu dan menafsirkannya sesuai dengan rangkaian karakter
  4. Browser secara internal mewakili karakter menggunakan nilai Unicode mereka
  5. Javascript menampilkan nilai Unicode yang sesuai

Perhatikan bahwa ketika dilihat sebagai ISO-8859-1, 5 angka pertama adalah sama (72, 208, 175, 226, 190) sebagai poin kode Unicode mereka. Ini karena Unicode banyak meminjam dari ISO-8859-1 dalam kisaran itu. Namun angka terakhir, simbol euro €, berbeda. Berada di posisi 128 di ISO-8859-1 dan memiliki nilai Unicode 8364

Ringkasan Sekitar tahun 2003

UTF-8 menjadi set karakter internasional paling populer di Internet, menggantikan set karakter byte tunggal yang lebih tua seperti ISO-8859-5. Saat Anda melihat atau mengirim dokumen non-Inggris, Anda masih perlu mengetahui rangkaian karakter apa yang digunakannya. Untuk interoperabilitas terluas, administrator situs web perlu memastikan semua halaman web mereka menggunakan kumpulan karakter UTF-8

Mungkin Ð terlihat familier — terkadang akan muncul jika Anda mencoba melihat dokumen UTF-8 Rusia. Bagian selanjutnya menjelaskan bagaimana kumpulan karakter menjadi bingung dan akhirnya menyimpan hal-hal yang salah dalam database

Banyak Masalah

Selama semua orang berbicara UTF-8, ini semua akan bekerja dengan lancar. Jika tidak, maka karakter bisa rusak. Untuk menjelaskan caranya, bayangkan interaksi tipikal sebuah situs web, seperti pengguna membuat komentar di postingan blog

  1. Halaman Web menampilkan formulir komentar
  2. Pengguna mengetik komentar dan mengirimkan
  3. Komentar dikirim kembali ke server dan disimpan dalam database
  4. Komentar kemudian diambil dari database dan ditampilkan di halaman Web

Proses sederhana ini bisa salah dalam banyak cara dan menghasilkan jenis masalah berikut

Entitas HTML

Berpura-pura sejenak bahwa Anda tidak tahu apa-apa tentang rangkaian karakter — hapus 30 menit terakhir dari ingatan Anda. Formulir di blog Anda mungkin akan muncul dengan sendirinya menggunakan set karakter ISO-8859-1. Kumpulan karakter ini tidak tahu bahasa Rusia atau Thailand atau Cina, dan hanya sedikit bahasa Yunani. Jika Anda mencoba menyalin dan menempelkan apa pun ke dalam formulir dan menekan Kirim, browser modern akan mencoba mengubahnya menjadi entitas numerik HTML seperti

HELLO
HELLO
<script>document.write ("HELLO");</script>
<script>document.write (String.fromCharCode (72,69,76,76,79));</script>
6 untuk Я

Itulah yang akan disimpan dalam database Anda, dan itulah yang akan dihasilkan saat komentar ditampilkan — yang artinya akan ditampilkan dengan baik di halaman Web, tetapi menimbulkan masalah saat Anda mencoba mengeluarkannya ke PDF atau email, atau menjalankan teks

Karakter Bingung

Bagaimana jika Anda mengoperasikan situs web Rusia, dan Anda belum menentukan set karakter di halaman Web Anda? . Untuk mengatakan “hai”, mereka mungkin mengetik Привет. Saat pengguna menekan Kirim , karakter dikodekan sesuai dengan set karakter halaman pengiriman. Dalam hal ini, Привет dikodekan sebagai angka 191, 224, 216, 210, 213 dan 226. Angka-angka itu akan dikirim melalui Internet ke server, dan disimpan seperti itu ke dalam database.

Jika nanti seseorang melihat komentar itu menggunakan ISO-8859-5, mereka akan melihat teks yang benar. Tetapi jika mereka melihat menggunakan kumpulan karakter Rusia yang berbeda seperti Windows-1251, mereka akan melihat їаШТХв. Itu masih bahasa Rusia, tapi tidak masuk akal

Karakter Beraksen dengan Banyak Vokal

Jika seseorang melihat komentar yang sama menggunakan ISO-8859-1, mereka akan melihat ¿àØÒÕâ alih-alih Привет. Ungkapan yang lebih panjang seperti Я тоже рада Вас видеть (“senang bertemu dengan Anda” secara formal kepada seorang wanita), dikirimkan sebagai ISO-8859-5, akan muncul di ISO-8859-1 sebagai Ï âÞÖÕ àÐÔÐ. Sepertinya karena rentang 128-255 ISO-8859-1 mengandung banyak vokal dengan aksen

Jadi jika Anda melihat pola semacam ini, mungkin karena teks telah dimasukkan dalam rangkaian karakter byte tunggal (salah satu dari ISO-8859 atau Windows) dan ditampilkan sebagai ISO-8859-1. Untuk memperbaiki teks, Anda harus mencari tahu set karakter mana yang dimasukkan, dan mengirimkannya kembali sebagai UTF-8

Karakter Aksen Bergantian

Bagaimana jika pengguna mengirimkan komentar di UTF-8? . 208⁄159, 209⁄128, 208⁄184, 208⁄178, 208⁄181 dan 209⁄130. Jika Anda melihatnya di ISO-8859-1 akan terlihat seperti itu. Привет

Perhatikan bahwa setiap karakter lainnya adalah Ð atau Ñ. Karakter tersebut adalah angka 208 dan 209, dan mereka memberi tahu UTF-8 untuk beralih ke rentang Cyrillic. Jadi jika Anda melihat banyak Ð dan Ñ, Anda dapat berasumsi bahwa Anda sedang melihat teks Rusia yang dimasukkan dalam UTF-8, dilihat sebagai ISO-8859-1. Demikian pula, bahasa Yunani akan memiliki banyak Î dan Ï, 206 dan 207. Dan bahasa Ibrani memiliki × bergantian, angka 215

Vokal Sebelum Tanda Pound dan Hak Cipta

Masalah yang sangat umum di Inggris adalah simbol mata uang £ yang dikonversi menjadi £. Ini adalah masalah yang persis sama seperti di atas dengan kebetulan yang menambah kebingungan. Simbol £ memiliki nilai Unicode dan ISO-8859-1 sebesar 163. Ingatlah bahwa dalam UTF-8 karakter apa pun di atas 127 diwakili oleh urutan dua angka atau lebih. Dalam hal ini, urutan UTF-8 adalah 194⁄163. Secara matematis, ini karena (194%32)*64 + (163%64) = 163

Secara visual itu berarti bahwa jika Anda melihat urutan UTF-8 menggunakan ISO-8859-1, tampaknya mendapatkan  yang merupakan karakter 194 dalam ISO-8859-1. Hal yang sama terjadi untuk semua poin kode Unicode 161-191, yang mencakup © dan ® dan ¥

Jadi jika £ atau © Anda tiba-tiba mewarisi Â, itu karena mereka dimasukkan sebagai UTF-8

Tanda Tanya Berlian Hitam

Bagaimana dengan sebaliknya? . 191, 224, dst. Jika Anda kemudian mencoba melihatnya sebagai UTF-8, Anda mungkin melihat banyak tanda tanya di dalam berlian hitam. �. Peramban menampilkan ini saat angka yang dibacanya tidak masuk akal

UTF-8 melakukan sinkronisasi sendiri. Tidak seperti pengkodean karakter multi-byte lainnya, Anda selalu tahu di mana Anda berada dengan UTF-8. Jika Anda melihat angka 192-247, Anda tahu bahwa Anda berada di awal urutan multi-byte. Jika Anda melihat 128-191, Anda tahu bahwa Anda berada di tengah-tengahnya. Tidak ada bahaya kehilangan nomor pertama dan mengacaukan sisa teks

Ini berarti bahwa dalam UTF-8, urutan 191 diikuti oleh 224 tidak akan pernah terjadi secara alami, sehingga browser tidak tahu apa yang harus dilakukan dengannya dan malah menampilkan ��

Ini juga dapat menyebabkan masalah terkait £ dan ©. £50 dalam ISO-8859-1 adalah angka 163, 53 dan 48. 53 dan 48 tidak menyebabkan masalah, tetapi di UTF-8, 163 tidak pernah muncul dengan sendirinya, jadi ini akan muncul sebagai �50. Demikian pula jika Anda melihat �2012, mungkin karena ©2012 dimasukkan sebagai ISO-8859-1 tetapi ditampilkan sebagai UTF-8

Kosong, Tanda Tanya dan Kotak

Bahkan jika mereka sepenuhnya up-to-speed dengan UTF-8 dan Unicode, browser mungkin masih tidak tahu cara menampilkan karakter. Beberapa karakter ASCII pertama 1-31 sebagian besar merupakan urutan kontrol untuk teleprinter (hal-hal seperti Acknowledge and Stop). Jika Anda mencoba menampilkannya, browser mungkin menampilkan ?

Juga, Unicode mendefinisikan lebih dari 110.000 karakter. Browser Anda mungkin tidak memiliki font yang tepat untuk menampilkan semuanya. Beberapa karakter yang lebih tidak jelas juga dapat ditampilkan sebagai ? . Di browser lama, bahkan karakter non-Inggris yang cukup umum dapat ditampilkan sebagai kotak

Peramban lama mungkin juga berperilaku berbeda untuk beberapa masalah di atas, menunjukkan ?

Database

Pembahasan di atas menghindari langkah tengah dalam proses — menyimpan data ke database. Database seperti MySQL juga dapat menentukan kumpulan karakter untuk database, tabel, atau kolom. Tapi itu kurang penting dari set karakter halaman Web

Saat menyimpan dan mengambil data, MySQL hanya berurusan dengan angka. Jika Anda menyuruhnya menyimpan nomor 163, itu akan terjadi. Jika Anda memberikannya 208⁄159 itu akan menghemat dua angka itu. Dan saat Anda mengambil data, Anda akan mendapatkan kembali dua angka yang sama

Kumpulan karakter menjadi lebih penting ketika Anda menggunakan fungsi basis data untuk membandingkan, mengonversi, dan mengukur data. Misalnya,

<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php for ($i=0; $i<256; $i++) echo ($i%32?’:'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>
_0 suatu bidang mungkin bergantung pada rangkaian karakternya, seperti halnya perbandingan string menggunakan
<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php for ($i=0; $i<256; $i++) echo ($i%32?’:'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>
1 dan
<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php for ($i=0; $i<256; $i++) echo ($i%32?’:'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>
2. Metode yang digunakan untuk membandingkan string disebut collation

Kumpulan karakter dan susunan di MySQL adalah subjek yang mendalam. Ini bukan sekadar mengubah rangkaian karakter tabel menjadi UTF-8. Ada perintah SQL lebih lanjut yang harus diperhitungkan untuk memastikan data masuk dan keluar dalam format yang benar juga

Mencobanya Sendiri

Kode PHP dan Javascript berikut memungkinkan Anda untuk bereksperimen dengan semua masalah ini. Anda dapat menentukan kumpulan karakter mana yang digunakan untuk memasukkan dan mengeluarkan teks, dan Anda juga dapat melihat pendapat browser tentangnya

<?php
$charset = $_POST['charset']; if (!$charset) $charset = 'ISO-8859-1';
$string = $_POST['string'];
if ($string) {
 echo '<p>This is what PHP thinks you entered:<br>';
 for ($i=0; $i<strlen($string); $i++) {$c=substr ($string,$i,1); echo ord ($c).': '.$c.' <br/>';}
} 
?> 
<html>
<head>
<meta charset="<?=$charset?>">
</head>
<body>
<form method="post">
<input name="lastcharset" type="hidden" value="<?php echo $charset?>"/>
Form was submitted as: <?php echo $_POST['lastcharset']?><br/>
Text is displayed as: <?php echo $charset?><br/>
Text will be submitted as: <?php echo $charset?><br/>
Copy and paste or type here:
<input name="string" type="text" size="20" value="<?php echo $string?>"/><br/>
Next page will display as:
<select name="charset"><option>ISO-8859-1<option>ISO-8859-5
<option>Windows-1251<option>ISO-8859-7<option>UTF-8</select><br/>
<input type="submit" value="Submit" onclick="ShowCharacters (this.form.string.value); return 1;"/>
</form>
<script type="text/javascript">
function ShowCharacters (s) {
  var r='You entered:';
  for (var i=0; i<s.length; i++) r += 'n' + s.charCodeAt (i) + ': ' + s.substr (i, 1);
  alert (r);
}
</script>
</body>
</html>

Ini adalah contoh kode dalam tindakan. Angka-angka di atas adalah nilai numerik dari masing-masing karakter dan representasi mereka (bila dilihat secara individual) dalam kumpulan karakter saat ini

Cara menampilkan karakter utf-8 di php

Contoh input dan output dalam set karakter yang berbeda. Ini menunjukkan tanda £ berubah menjadi � di Google Chrome

Halaman di atas menunjukkan set karakter sebelumnya, saat ini dan masa depan. Anda dapat menggunakan kode ini untuk melihat dengan cepat bagaimana teks bisa benar-benar rusak. Misalnya, jika Anda menekan Kirim lagi di atas, � memiliki titik kode Unicode 65533 yaitu 239/191/189 dalam UTF-8 dan akan ditampilkan sebagai �50 dalam ISO-8859-1. Jadi jika Anda pernah mendapatkan simbol £ berubah menjadi �, itu mungkin rute yang mereka ambil

Perhatikan bahwa kotak pilih di bagian bawah akan berubah kembali ke ISO-8859-1 setiap saat

Satu Solusi

Semua masalah pengkodean di atas disebabkan oleh teks yang dikirimkan dalam satu set karakter dan dilihat di set karakter lainnya. Solusinya adalah memastikan bahwa setiap halaman di situs web Anda menggunakan UTF-8. Anda dapat melakukannya dengan salah satu baris ini segera setelah tag

<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php for ($i=0; $i<256; $i++) echo ($i%32?’:'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>
3

<meta charset="UTF-8">
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">

Itu harus menjadi salah satu hal pertama di halaman Web Anda, karena itu akan menyebabkan browser melihat kembali halaman tersebut dengan cara yang benar-benar baru. Untuk kecepatan dan efisiensi, ini harus dilakukan sesegera mungkin

Anda juga dapat menentukan UTF-8 di tabel MySQL Anda, meskipun untuk menggunakan fitur ini sepenuhnya, Anda harus menggali lebih dalam

Perhatikan bahwa pengguna masih dapat mengganti set karakter di browser mereka. Ini jarang terjadi, tetapi berarti solusi ini tidak dijamin berhasil. Untuk keamanan ekstra, Anda dapat menerapkan pemeriksaan back-end untuk memastikan data tiba dalam format yang benar

Situs Web yang Ada

Jika situs web Anda telah mengumpulkan teks dalam berbagai bahasa, Anda juga perlu mengubah data yang ada menjadi UTF-8. Jika tidak banyak, Anda dapat menggunakan halaman PHP seperti di atas untuk mengetahui kumpulan karakter asli, dan menggunakan browser untuk mengonversi data menjadi UTF-8

Jika Anda memiliki banyak data dalam berbagai kumpulan karakter, Anda harus terlebih dahulu mendeteksi kumpulan karakter dan kemudian mengonversinya. Di PHP Anda dapat menggunakan

<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php for ($i=0; $i<256; $i++) echo ($i%32?’:'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>
_4 untuk mendeteksi dan
<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php for ($i=0; $i<256; $i++) echo ($i%32?’:'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>
5 untuk mengonversi. Membaca komentar untuk
<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php for ($i=0; $i<256; $i++) echo ($i%32?’:'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>
_4, sepertinya fungsi yang cukup rewel, jadi pastikan untuk bereksperimen untuk memastikan Anda menggunakannya dengan benar dan mendapatkan hasil yang tepat

Fungsi yang berpotensi menyesatkan adalah

<html>
<head>
<meta charset="ISO-8859-5">
</head>
<body>
<style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style>
<?php for ($i=0; $i<256; $i++) echo ($i%32?’:'<p>') . $i . ': ' . chr ($i) . '<br>'; ?>
</body>
</html>
_7. Ini mengubah UTF-8 menjadi ISO-8859-1. Karakter apa pun yang tidak tersedia di ISO-8859-1 (seperti Cyrillic, Greek, Thai, dll) diubah menjadi tanda tanya. Itu menyesatkan karena Anda mungkin mengharapkan lebih darinya, tetapi itu melakukan yang terbaik yang bisa dilakukan

Ringkasan

Artikel ini sangat bergantung pada angka dan berusaha untuk tidak melewatkan kebutuhan bisnis yang terlewat. Semoga telah memberikan pemahaman yang mendalam tentang set karakter, Unicode, UTF-8 dan berbagai masalah yang dapat muncul. Pesan moral dari cerita tersebut adalah

Cara menggunakan UTF

Pengodean PHP UTF-8 – modifikasi kode Anda. .
Setel UTF-8 sebagai set karakter untuk semua output header dengan kode PHP Anda. .
Tentukan UTF-8 sebagai jenis penyandian untuk XML. .
Keluarkan karakter yang tidak didukung dari XML. .
Tentukan UTF-8 sebagai rangkaian karakter untuk semua konten HTML

Bagaimana cara memeriksa UTF

Anda dapat menggunakan pemeriksaan validitas UTF-8 yang tersedia di preg_match [Panduan PHP] sejak PHP 4. 3. 5. Itu akan mengembalikan 0 (tanpa informasi tambahan) jika string yang tidak valid diberikan. $isUTF8 = preg_match('//u', $string);

Bagaimana cara mengonversi UTF

Lihat Juga ¶ .
utf8_decode() - Mengonversi string dari UTF-8 ke ISO-8859-1, menggantikan karakter yang tidak valid atau tidak dapat direpresentasikan
mb_convert_encoding() - Mengonversi string dari satu pengkodean karakter ke yang lain
UConverter. transcode() - Mengonversi string dari satu pengkodean karakter ke yang lain

Bagaimana cara menulis karakter Unicode di PHP?

string str = "\u1000"; Contoh ini membuat string dengan satu karakter Unicode yang "Nilai numerik Unicode"-nya adalah 1000 dalam heksadesimal (4096 dalam desimal).