Saya mencoba mem-parsing beberapa HTML menggunakan DOMDocument, tetapi ketika saya melakukannya, tiba-tiba saya kehilangan penyandian saya (setidaknya begitulah yang terlihat oleh saya).
$profile = "<div><p>various japanese characters</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
$divs = $dom->getElementsByTagName('div');
foreach ($divs as $div) {
echo $dom->saveHTML($div);
}
Hasil dari kode ini adalah saya mendapatkan banyak karakter yang bukan bahasa Jepang. Namun, jika saya lakukan:
echo $profile;
ini ditampilkan dengan benar. Saya sudah mencoba saveHTML dan saveXML, dan keduanya tidak ditampilkan dengan benar. Saya menggunakan PHP 5.3.
Apa yang saya lihat:
ã¤ãªãã¤å·ã·ã«ã´ã«ã¦ãã¢ã¤ã«ã©ã³ãç³»ã®å®¶åºã«ã9人åå¼ã®5çªç®ã¨ãã¦çã¾ãããå½¼ãå«ãã¦4人ã俳åªã«ãªã£ããç¶è¦ªã¯æ¨æã®ã»ã¼ã«ã¹ãã³ã§ãæ¯è¦ªã¯éµä¾¿å±ã®å®¢å®¤ä¿ã ã£ããé«æ ¡æ代ã¯ãã£ãã£ã®ã¢ã«ãã¤ãã«å¤ãã¿ãæè²è³éãåããªããã«ããªãã¯ç³»ã®é«æ ¡ã¸é²å¦ã
Apa yang harus ditampilkan:
イリノイ州シカゴにて、アイルランド系の家庭に、9人兄弟の5番目として生まれる。彼を含めて4人が俳優になった。父親は木材のセールスマンで、母親は郵便局の客室係だった。高校時代はキャディのアルバイトに勤しみ、教育資金を受けながらカトリック系の高校へ進学
EDIT: Saya telah menyederhanakan kode menjadi lima baris sehingga Anda dapat mengujinya sendiri.
$profile = "<div lang=ja><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>";
$dom = new DOMDocument();
$dom->loadHTML($profile);
echo $dom->saveHTML();
echo $profile;
Berikut adalah html yang dikembalikan:
<div lang="ja"><p>イリノイ州シカゴã«ã¦ã€ã‚¢ã‚¤ãƒ«ãƒ©ãƒ³ãƒ‰ç³»ã®å®¶åºã«ã€</p></div>
<div lang="ja"><p>イリノイ州シカゴにて、アイルランド系の家庭に、</p></div>
php
utf-8
character-encoding
Sedikit A.
sumber
sumber
Jawaban:
DOMDocument::loadHTML
akan memperlakukan string Anda sebagai ISO-8859-1 kecuali Anda memberi tahu sebaliknya. Ini menghasilkan string UTF-8 ditafsirkan secara salah.Jika string Anda tidak mengandung deklarasi penyandian XML, Anda dapat menambahkannya untuk menyebabkan string diperlakukan sebagai UTF-8:
Jika Anda tidak dapat mengetahui apakah string tersebut sudah berisi pernyataan seperti itu, ada solusi di SmartDOMDocument yang akan membantu Anda:
Ini bukan solusi yang hebat, tetapi karena tidak semua karakter dapat diwakili dalam ISO-8859-1 (seperti katana ini), itu adalah alternatif paling aman.
sumber
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $content);
memperbaikinya untuk saya di PHP7 (jadi masih masalah) - ini adalah masalah yang sangat menjengkelkan, karena saya mendefinisikan utf8 dalam dokumen HTML (with<meta charset="UTF-8" />
) tapi itu tidak berpengaruh, sepertinya memerlukan bagian <? xml, yang sama sekali tidak intuitif.$dom->loadHTML(mb_convert_encoding($profile, 'HTML-ENTITIES', 'UTF-8'));
bekerja hebat! Terima kasih,Masalahnya adalah dengan
saveHTML()
dansaveXML()
, keduanya tidak berfungsi dengan benar di Unix. Mereka tidak menyimpan karakter UTF-8 dengan benar ketika digunakan di Unix, tetapi mereka bekerja di Windows.Solusinya sangat sederhana:
Jika Anda mencoba default, Anda akan mendapatkan kesalahan yang Anda jelaskan
Yang harus Anda lakukan adalah menyimpan sebagai berikut:
Baris kode ini akan membuat karakter UTF-8 Anda disimpan dengan benar. Gunakan solusi yang sama jika Anda menggunakan
saveXML()
.Memperbarui
Seperti yang disarankan oleh " Jack M " di bagian komentar di bawah, dan diverifikasi oleh " Pamela " dan " Marco Aurélio Deleu ", variasi berikut mungkin berfungsi dalam kasus Anda:
Catatan
Karakter bahasa Inggris tidak menyebabkan masalah ketika Anda menggunakan
saveHTML()
tanpa parameter (karena karakter bahasa Inggris disimpan sebagai karakter byte tunggal di UTF-8)Masalahnya terjadi ketika Anda memiliki karakter multi-byte (seperti Cina, Rusia, Arab, Ibrani, ... dll.)
Saya sarankan membaca artikel ini: http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/ . Anda akan memahami cara kerja UTF-8 dan mengapa Anda memiliki masalah ini. Ini akan memakan waktu sekitar 30 menit, tetapi menghabiskan waktu dengan baik.
sumber
$str = utf8_decode($dom->saveHTML($dom->documentElement));
utf8_decode($dom->saveHTML($dom->documentElement));
melakukannya dengan sempurna untuk saya.Pastikan file sumber asli disimpan sebagai UTF-8 (Anda bahkan mungkin ingin mencoba BOM Chars yang tidak direkomendasikan dengan UTF-8 untuk memastikan).
Juga dalam hal HTML, pastikan Anda telah menyatakan pengkodean yang benar menggunakan
meta
tag:Jika itu adalah CMS (karena Anda telah menandai pertanyaan Anda dengan Joomla), Anda mungkin perlu mengonfigurasi pengaturan yang sesuai untuk penyandian.
sumber
<meta charset="UTF-8">
tag yang lebih baru tidak berfungsi dengan DOMDocument.Anda bisa mengawali
utf-8
pengkodean garis penegakan , seperti ini:Dan Anda kemudian dapat melanjutkan dengan kode yang sudah Anda miliki, seperti:
sumber
Saya perlu beberapa saat untuk mencari tahu tapi inilah jawaban saya.
Sebelum menggunakan DomDocument saya akan menggunakan file_get_contents untuk mengambil url dan kemudian memprosesnya dengan fungsi string. Mungkin bukan cara terbaik tapi cepat. Setelah diyakinkan Dom sama cepatnya, saya pertama kali mencoba yang berikut:
Ini gagal secara spektakuler dalam mempertahankan pengkodean UTF-8 meskipun ada meta tag, pengaturan php dan semua solusi yang ditawarkan di sini dan di tempat lain. Inilah yang berhasil:
dll. Sekarang semuanya benar dengan dunia. Semoga ini membantu.
sumber
DomDocument('1.0', 'UTF-8')
. Tetapi dalam kasus saya hanya sebagian html yang dimuat.Anda harus memberi makan DOMDocument versi HTML Anda dengan header yang masuk akal. Sama seperti HTML5.
mungkin ide yang bagus untuk menjaga agar html Anda tetap valid, sehingga Anda tidak akan mendapat masalah ketika Anda akan memulai permintaan ... sekitar :-) dan menjauhlah dari
htmlentities
!!!! Itu bolak-balik sumber daya yang diperlukan. pertahankan kode Anda tetap gila !!!!sumber
Saya menggunakan php 7.3.8 di manjaro dan saya bekerja dengan konten Persia. Ini menyelesaikan masalah saya:
sumber
Bekerja untuk saya:
sumber
?
)Gunakan untuk hasil yang benar
Operasi ini
Ini cara yang buruk, karena simbol khusus seperti & lt; , & gt; bisa dalam $ profil, dan mereka tidak akan mengonversi dua kali setelah mb_convert_encoding. Ini adalah lubang untuk XSS dan HTML salah.
sumber
Satu-satunya hal yang berhasil bagi saya adalah jawaban yang diterima
NAMUN
Ini membawa masalah baru, memiliki
<?xml encoding="utf-8" ?>
dalam keluaran dokumen.Solusi bagi saya adalah kemudian melakukannya
Beberapa solusi mengatakan kepada saya bahwa untuk menghapus
xml
header, saya harus melakukanBagi saya ini tidak berfungsi sebagai dokumen parsial (mis. Dokumen dengan dua
<p>
tag), hanya satu dari<p>
tag yang dikembalikan.sumber
Masalahnya adalah ketika Anda menambahkan parameter ke fungsi DOMDocument :: saveHTML (), Anda kehilangan enkode. Dalam beberapa kasus, Anda harus menghindari penggunaan parameter dan menggunakan fungsi string lama untuk menemukan apa yang Anda cari.
Saya pikir jawaban sebelumnya bekerja untuk Anda, tetapi karena solusi ini tidak berhasil untuk saya, saya menambahkan jawaban itu untuk membantu ppl yang mungkin ada dalam kasus saya.
sumber
Dapat juga menyandikan seperti di bawah ini .... dikumpulkan dari https://davidwalsh.name/domdocument-utf8-problem
sumber