I'm menyiapkan server baru dan ingin mendukung UTF-8 sepenuhnya di aplikasi web saya. Saya telah mencoba ini di masa lalu di server yang ada dan selalu tampaknya berakhir setelah jatuh kembali ke ISO-8859-1.
Di mana persis apakah saya perlu untuk menetapkan pengkodean/charset? I'm menyadari bahwa saya perlu untuk mengkonfigurasi Apache, MySQL, dan PHP untuk melakukan hal ini — ada beberapa standar checklist saya bisa mengikuti, atau mungkin memecahkan masalah di mana terjadi ketidaksesuaian?
Ini adalah untuk yang baru Linux server, menjalankan MySQL 5, PHP, 5 dan Apache 2.
Penyimpanan Data:
utf8mb4
set karakter pada semua tabel dan kolom teks dalam database anda. Hal ini membuat MySQL secara fisik menyimpan dan mengambil nilai-nilai yang dikodekan secara native dalam UTF-8. Perhatikan bahwa MySQL akan secara implisit menggunakan utf8mb4
encoding jika utf8mb4_*
pemeriksaan yang ditentukan (tanpa eksplisit set karakter). utf8
, yang hanya mendukung subset dari karakter Unicode. Aku berharap aku bercanda.
Akses Data: utf8mb4
. Dengan cara ini, MySQL tidak ada konversi dari aslinya UTF-8 ketika tangan data untuk aplikasi anda dan sebaliknya. charset
di DSN:
$dbh = new PDO('mysql:charset=utf8mb4'); set_charset()
:
$mysqli->set_charset('utf8mb4'); // objek oriented style
mysqli_set_charset($link, 'utf8mb4'); // gaya prosedural mysql_set_charset
. NAMA SET 'utf8mb4'
. utf8mb4
/utf8
berlaku seperti di atas.
Output: default_charset
php.ini pilihan, atau secara manual masalah Content-Type
MIME header sendiri, yang hanya lebih banyak pekerjaan, tetapi memiliki efek yang sama. json_encode()
, tambahkan JSON_UNESCAPED_UNICODE
sebagai parameter kedua.
Masukan****: mb_check_encoding()
melakukan trik, tapi anda harus menggunakannya agama. Ada's benar-benar tidak ada cara sekitar ini, seperti berbahaya klien dapat mengirimkan data apapun encoding yang mereka inginkan, dan saya belum't menemukan sebuah trik untuk dapatkan PHP untuk melakukan ini untuk anda dengan andal. accept-charset
atribut untuk semua <form>
tags: <form ... accept-charset="UTF-8">
. <form>
tag.
Kode Lain Pertimbangan: mbstring
ekstensi. mbstring
fungsi.I'd ingin menambahkan satu hal yang perlu chazomaticus' setiap jawaban:
Don't lupa tag META yang baik (seperti ini, atau dengan HTML4 atau XHTML versi):
<meta charset="utf-8">
Yang tampaknya sepele, tapi IE7 telah memberi saya masalah dengan yang sebelumnya.
Saya melakukan segalanya dengan benar; database, koneksi database dan Content-Type header HTTP yang siap untuk UTF-8, dan itu bekerja dengan baik di semua browser lainnya, namun Internet Explorer masih bersikeras menggunakan "Eropa Barat" encoding.
Ternyata halaman itu hilang META tag. Menambahkan bahwa memecahkan masalah.
Edit:
≪abbr title="World Wide Web Consortium">W3C sebenarnya telah agak besar bagian yang didedikasikan untuk I18N. Mereka memiliki jumlah artikel yang berkaitan dengan masalah ini – menggambarkan HTTP, (X)HTML dan CSS sisi hal:
Mereka merekomendasikan menggunakan header HTTP dan HTML meta tag (atau deklarasi XML dalam kasus XHTML menjabat sebagai XML).
Selain itu untuk pengaturan default_charset
di php.ini, anda dapat mengirim benar menggunakan charset header()
dari dalam kode anda, sebelum ada output:
header('Content-Type: text/html; charset=utf-8');
Bekerja dengan Unicode di PHP lebih mudah selama anda menyadari bahwa sebagian besar dari fungsi-fungsi string don't bekerja dengan Unicode, dan beberapa mungkin mangle string-benar. PHP menganggap "karakter" untuk 1 byte panjang. Kadang-kadang hal ini baik-baik saja (misalnya, explode()
hanya terlihat untuk urutan byte dan menggunakannya sebagai pemisah -- sehingga tidak't peduli apa sebenarnya karakter anda mencari). Tapi lain kali, ketika fungsi ini benar-benar dirancang untuk bekerja pada karakter, PHP tidak tahu bahwa teks anda memiliki karakter multi-byte yang ditemukan dengan Unicode.
Perpustakaan yang baik untuk memeriksa ke phputf8. Ini penulisan ulang semua "buruk" fungsi sehingga anda dapat dengan aman bekerja pada UTF-8 string. Ada ekstensi seperti ekstensi mbstring yang mencoba untuk melakukan hal ini untuk anda, juga, tapi saya lebih suka menggunakan perpustakaan karena itu's lebih portabel (tapi saya menulis massa-pasar produk, sehingga's penting untuk saya). Tapi phputf8 dapat menggunakan mbstring di belakang layar, bagaimanapun, untuk meningkatkan kinerja.
Saya menemukan masalah dengan seseorang menggunakan PDO dan jawabannya adalah untuk menggunakan ini untuk koneksi PDO string:
$pdo = new PDO(
'mysql:host=mysql.example.com;dbname=example_db',
"username",
"password",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
Situs ini saya ambil dari bawah, tetapi saya bisa mendapatkan itu dengan menggunakan Google cache, untungnya.
Dalam kasus saya, saya menggunakan mb_split
, yang menggunakan regex. Oleh karena itu saya juga harus secara manual pastikan regex encoding adalah utf-8 dengan melakukan mb_regex_encoding('UTF-8');
Sebagai catatan, saya juga menemukan dengan menjalankan mb_internal_encoding()
bahwa internal encoding itu't utf-8, dan saya berubah bahwa dengan menjalankan mb_internal_encoding("UTF-8");
.
Pertama-tama jika anda berada di < 5.3 PHP maka tidak ada. Anda've punya banyak masalah untuk mengatasi.
Saya terkejut bahwa tidak ada yang menyebutkan internasional perpustakaan, salah satu yang memiliki dukungan yang baik untuk unicode, grafem, operasi string , lokalisasi dan masih banyak lagi, lihat di bawah ini.
Saya akan mengutip beberapa informasi tentang unicode support di PHP oleh Elizabeth Smith's slide di PHPBenelux'14
Baik:
Buruk:
stream_filter_append($fp, 'mengkonversi.iconv.ISO-2022-JP/EUC-JP')
Saya akan update ini jawaban dalam kasus hal-hal yang mengubah fitur yang ditambahkan dan sebagainya.
Saya baru-baru menemukan bahwa menggunakan strtolower()
dapat menyebabkan masalah di mana data yang terpotong setelah karakter khusus.
Solusinya adalah menggunakan
mb_strtolower($string, 'UTF-8');
mb_ menggunakan MultiByte. Mendukung lebih banyak karakter tetapi secara umum sedikit lebih lambat.
Satu-satunya hal yang saya akan menambahkan untuk ini jawaban yang luar biasa adalah untuk menekankan pada menyimpan file di encoding utf8, saya telah memperhatikan bahwa browser menerima properti ini atas pengaturan utf8 sebagai kode encoding. Setiap editor teks akan menunjukkan kepada anda ini, misalnya Notepad++ memiliki pilihan menu untuk file enconding, itu menunjukkan anda pengkodean saat ini dan memungkinkan anda untuk mengubah itu. Untuk semua file php yang saya gunakan utf-8 tanpa BOM.
Beberapa waktu lalu saya memiliki seseorang yang meminta saya untuk menambahkan utf8 dukungan untuk php/mysql aplikasi yang dirancang oleh orang lain, saya melihat bahwa semua file yang dikodekan dalam ANSI, jadi saya harus menggunakan ICONV untuk mengkonversi semua file, mengubah tabel database menggunakan charset utf-8 dan utf8_general_ci menyusun, tambahkan 'NAMA SET utf8' ke database abstraction layer setelah koneksi (jika menggunakan 5.3.6 atau lebih awal jika tidak, anda harus menggunakan charset=utf8 dalam connection string) dan perubahan fungsi string menggunakan php multibyte string fungsi-fungsi yang setara.
Di PHP, anda'll harus menggunakan multibyte fungsi, atau menghidupkan mbstring.func_overload. Dengan cara itu hal-hal seperti strlen akan bekerja jika anda memiliki karakter yang mengambil lebih dari satu byte.
Anda'll juga perlu mengidentifikasi karakter set tanggapan anda. Anda bisa menggunakan AddDefaultCharset, seperti di atas, atau menulis kode PHP yang mengembalikan header. (Atau, anda dapat menambahkan META tag ke situs dokumen HTML.)
Aku hanya pergi melalui masalah yang sama dan menemukan solusi yang baik di PHP manual.
Saya mengubah semua file saya encoding UTF8 maka pengkodean default pada koneksi saya. Ini memecahkan semua masalah.
if (!$mysqli->set_charset("utf8")) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
printf("Current character set: %s\n", $mysqli->character_set_name());
}
Dukungan Unicode di PHP masih menjadi kekacauan besar. Sementara itu's mampu mengkonversi sebuah ISO8859 string (yang digunakan secara internal) untuk utf8, itu tidak memiliki kemampuan untuk bekerja dengan string unicode native, yang berarti semua string fungsi pengolahan akan mangle dan korup string anda. Jadi, anda harus menggunakan perpustakaan yang terpisah untuk tepat utf8 dukungan, atau menulis ulang semua fungsi penanganan string diri sendiri.
Bagian yang mudah hanya menentukan charset di header HTTP dan dalam database tersebut, tapi itu tidak penting jika kode PHP anda doesn't output yang valid UTF-8. Yang's bagian yang sulit, dan PHP akan memberikan anda hampir tidak ada bantuan. (Saya pikir PHP6 seharusnya untuk memperbaiki terburuk dari ini, tapi yang's masih sementara)
Jika anda ingin MySQL server untuk memutuskan set karakter, dan PHP sebagai klien (old perilaku; disukai, dalam pendapat saya), coba tambahkan skip-karakter-set-klien-jabat tangan
untuk anda saya.cnf
, di bawah [mysqld]
, dan restart mysql
.
Hal ini dapat menyebabkan masalah dalam kasus anda're menggunakan apa-apa selain UTF8.
Atas jawabannya yang sangat baik. Berikut adalah apa yang harus saya pada debian/php/mysql setup:
// storage
// debian. apparently already utf-8
// retrieval
// the mysql database was stored in utf-8,
// but apparently php was requesting iso. this worked:
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');
// delivery
// php.ini did not have a default charset,
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');
// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.
// processing
// changed a few commands in php, like substr,
// to mb_substr
itu semua !
jika anda ingin mysql solusi, saya punya masalah yang sama dengan 2 proyek saya, setelah migrasi server. Setelah mencari dan mencoba banyak solusi yang saya datang di dengan yang satu ini /ada yang sebelum ini bekerja):
mysqli_set_charset($con,"utf8");
Setelah menambahkan baris ini ke file konfigurasi semuanya bekerja baik-baik saja!
Saya menemukan solusi ini https://www.w3schools.com/PHP/func_mysqli_set_charset.asp ketika saya sedang mencari untuk memecahkan menyisipkan dari html query
good luck!
Hanya sebuah catatan:
Anda menghadapi masalah anda karakter non-latin menunjukkan sebagai?????????
, anda mengajukan suatu pertanyaan, dan itu bisa ditutup dengan referensi ini canonical pertanyaan, anda mencoba segalanya dan tidak peduli apa yang anda lakukan anda masih mendapatkan??????????
dari MySQL
.
Itu adalah sebagian besar karena anda adalah pengujian pada data lama anda yang telah dimasukkan ke database menggunakan salah charset dan mendapat dikonversi dan disimpan untuk benar-benar karakter tanda tanya ?
. Yang berarti anda kehilangan teks asli selamanya dan tidak peduli apa yang anda mencoba anda akan mendapatkan???????
.
re menerapkan apa yang telah anda pelajari dari jawaban dari pertanyaan ini pada data baru bisa memecahkan masalah anda.