Bagaimana cara mengubah karakter menjadi unicode di php?

Tip. Untuk mengonversi entitas HTML khusus kembali ke karakter, gunakan fungsi htmlspecialchars_decode()


Sintaksis

htmlspecialchars(string,flags,karakter-set,double_encode)

Nilai Parameter

ParameterDeskripsistringDiperlukan. Menentukan string untuk convertflagsOptional. Menentukan cara menangani tanda kutip, penyandian yang tidak valid, dan tipe dokumen yang digunakan

Gaya penawaran yang tersedia adalah

  • ENT_COMPAT - Bawaan. Mengkodekan hanya tanda kutip ganda
  • ENT_QUOTES - Mengkodekan tanda kutip ganda dan tunggal
  • ENT_NOQUOTES - Tidak menyandikan kutipan apa pun

Pengkodean tidak valid

  • ENT_IGNORE - Abaikan penyandian yang tidak valid alih-alih meminta fungsi mengembalikan string kosong. Harus dihindari, karena mungkin memiliki implikasi keamanan
  • ENT_SUBSTITUTE - Mengganti pengodean yang tidak valid untuk rangkaian karakter tertentu dengan Karakter Pengganti Unicode U+FFFD (UTF-8) atau &#FFFD;
  • ENT_DISALLOWED - Mengganti poin kode yang tidak valid dalam doctype yang ditentukan dengan Karakter Pengganti Unicode U+FFFD (UTF-8) atau &#FFFD;

Bendera tambahan untuk menentukan doctype yang digunakan

  • ENT_HTML401 - Bawaan. Menangani kode sebagai HTML 4. 01
  • ENT_HTML5 - Tangani kode sebagai HTML 5
  • ENT_XML1 - Tangani kode sebagai XML 1
  • ENT_XHTML - Tangani kode sebagai XHTML
set karakterOpsional. Sebuah string yang menentukan rangkaian karakter mana yang akan digunakan

Nilai yang diperbolehkan adalah

  • UTF-8 - Bawaan. ASCII kompatibel multi-byte 8-bit Unicode
  • ISO-8859-1 - Eropa Barat
  • ISO-8859-15 - Eropa Barat (menambahkan tanda Euro + huruf Prancis dan Finlandia yang hilang di ISO-8859-1)
  • cp866 - charset Cyrillic khusus DOS
  • cp1251 - charset Cyrillic khusus Windows
  • cp1252 - rangkaian karakter khusus Windows untuk Eropa Barat
  • KOI8-R - Rusia
  • BIG5 - Bahasa Cina Tradisional, terutama digunakan di Taiwan
  • GB2312 - Cina Sederhana, kumpulan karakter standar nasional
  • BIG5-HKSCS - Big5 dengan ekstensi Hong Kong
  • Shift_JIS - Jepang
  • EUC-JP - Jepang
  • MacRoman - Kumpulan karakter yang digunakan oleh Mac OS

Catatan. Kumpulan karakter yang tidak dikenal akan diabaikan dan diganti dengan ISO-8859-1 dalam versi sebelum PHP 5. 4. Mulai dari PHP5. 4, itu akan diabaikan dan digantikan oleh UTF-8

double_encodeOpsional. Nilai boolean yang menentukan apakah akan menyandikan entitas html yang ada atau tidak
  • BENAR - Default. Akan mengubah segalanya
  • SALAH - Tidak akan menyandikan entitas html yang ada


Detail Teknis

Nilai Pengembalian. Mengembalikan string yang dikonversi

Jika string berisi pengkodean yang tidak valid, itu akan mengembalikan string kosong, kecuali flag ENT_IGNORE atau ENT_SUBSTITUTE disetel

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

Bagaimana cara mengubah karakter menjadi unicode di php?

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

Bagaimana cara mengubah karakter menjadi unicode di php?
Sumber

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 hari 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

Bagaimana cara mengubah karakter menjadi unicode di php?

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

Bagaimana cara mengubah karakter menjadi unicode di php?

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 benar 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.

Bagaimana cara mengubah string menjadi Unicode di PHP?

Fungsi 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.

Bagaimana cara mengonversi emoji ke Unicode di PHP?

fungsi php emoji_to_unicode($emoji) { $emoji = mb_convert_encoding($emoji, 'UTF-32', 'UTF-8');

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 mengubah ASCII ke UTF

Jika 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.