Masalah penyandian HTML - “” karakter muncul alih-alih “& nbsp;”


203

Saya punya aplikasi warisan yang baru saja mulai berlaku tidak sopan, untuk alasan apa pun saya tidak yakin. Ini menghasilkan banyak HTML yang diubah menjadi laporan PDF oleh ActivePDF.

Prosesnya bekerja seperti ini:

  1. Tarik templat HTML dari DB dengan token di dalamnya untuk diganti (mis. "~ CompanyName ~", "~ CustomerName ~", dll.)
  2. Ganti token dengan data nyata
  3. Rapikan HTML dengan fungsi regex sederhana yang properti memformat nilai atribut tag HTML (memastikan tanda kutip, dll, karena mesin rendering ActivePDF membenci apa pun kecuali tanda kutip tunggal di sekitar nilai atribut)
  4. Kirim HTML ke layanan web yang membuat PDF.

Di suatu tempat dalam kekacauan itu, ruang tanpa putus dari template HTML (   s) dikodekan sebagai ISO-8859-1 sehingga mereka muncul secara tidak benar sebagai karakter "Â" ketika melihat dokumen di browser (FireFox). ActivePDF muntah pada karakter non-UTF8 ini.

Pertanyaan saya: karena saya tidak tahu dari mana masalah itu berasal dan tidak punya waktu untuk menyelidikinya, apakah ada cara mudah untuk menyandikan ulang atau menemukan dan mengganti karakter yang buruk? Saya sudah mencoba mengirimnya melalui fungsi kecil yang saya lempar bersama, tetapi ternyata semuanya menjadi gobbledegook tidak mengubah apa pun.

Private Shared Function ConvertToUTF8(ByVal html As String) As String
    Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
    Dim source As Byte() = isoEncoding.GetBytes(html)
    Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function

Ada ide?

EDIT:

Saya bertahan dengan ini untuk saat ini, meskipun sepertinya ini bukan solusi yang baik:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function

2
Apakah HTML berisi informasi meta apa pun untuk menggambarkan rangkaian karakternya?
Rowland Shaw

1
[Komentar sebelumnya dihapus] Jawaban singkat: tidak.
Cᴏʀʏ

1
Bagi saya bekerja: utf8_decode ()
ursuleacv

Jawaban:


340

Di suatu tempat dalam kekacauan itu, ruang tanpa putus dari templat HTML (s) dikodekan sebagai ISO-8859-1 sehingga mereka tampil tidak benar sebagai karakter "Â"

Itu akan menjadi pengkodean untuk UTF-8, bukan ISO-8859-1. Karakter non-breaking space adalah byte 0xA0 di ISO-8859-1; ketika dikodekan ke UTF-8 itu akan menjadi 0xC2,0xA0, yang, jika Anda (salah) melihatnya sebagai ISO-8859-1 keluar sebagai " ". Itu termasuk nbsp tambahan yang mungkin tidak Anda sadari; jika byte itu tidak ada, maka sesuatu yang lain telah menganiaya dokumen Anda dan kami perlu melihat lebih jauh untuk mengetahui apa.

Apa regexp itu, bagaimana templating berfungsi? Tampaknya akan ada parser HTML yang tepat terlibat di suatu tempat jika Anda  string (dengan benar) diubah menjadi karakter U + 00A0 NON-BREAKING SPACE. Jika demikian, Anda bisa memproses templat secara native di DOM, dan memintanya untuk bersambung menggunakan pengodean ASCII untuk menjaga karakter non-ASCII sebagai referensi karakter. Itu juga akan menghentikan Anda harus melakukan regex post-processing pada HTML itu sendiri, yang selalu merupakan bisnis yang sangat cerdik.

Yah, untuk sekarang, Anda dapat menambahkan salah satu dari yang berikut ke dokumen Anda <head>dan melihat apakah itu membuatnya terlihat benar di browser:

  • untuk HTML4: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • untuk HTML5: <meta charset="utf-8">

Jika Anda telah melakukan itu, maka masalah yang tersisa adalah kesalahan ActivePDF.


20
Saya belum merekomendasikan <meta charset="utf-8">. The http-equivVersi masih berlaku di HTML5 dan lebih baik didukung.
bobince

8
Jawaban dari Mana yang Digunakan: <meta charset = 'utf-8'> vs <meta http-equiv = 'Jenis-Konten' menyatakan bahwa versi pendek didukung dengan baik.
Richard Ayotte


Ini bekerja di semua browser modern . Ini tentu saja tidak berfungsi di semua browser lawas dan niche (mis. Ponsel), atau di semua spider.
bobince

3
"Di suatu tempat di kekacauan itu" ... LOL! Bagus terbuka! Jawaban yang bagus! +1
Resist Design

24

Jika ada yang memiliki masalah yang sama dengan saya dan charset sudah benar, lakukan saja ini:

  1. Salin semua kode di dalam file .html.
  2. Buka notepad (atau editor teks dasar) dan rekatkan kodenya.
  3. Buka "File -> Save As"
  4. Masukkan nama file Anda "example.html" (Pilih "Simpan sebagai tipe: Semua File ( . )")
  5. Pilih Pengkodean sebagai UTF-8
  6. Tekan Simpan dan sekarang Anda dapat menghapus file .html lama Anda dan pengodeannya harus diperbaiki

2
Ini berhasil untuk saya. Sekarang dalam luhur katanya UTF-8 with BOMbukan UTF-8. Untuk melihatnya dalam teks luhur, Anda perlu show_encodingmengaturnya truedi Pengaturan - Pengguna.
J86

Saya memiliki masalah yang menunjukkan  alih-alih », amd Ketika Menggunakan solusi ini masalah terpecahkan tetapi ada peringatan php: Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\edit\business_details.php:1) in D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\user\include\fg_membersite.php on line 152
SCC

Solusi ini berhasil untuk saya. Saya bekerja di notepad ++, dan ketika saya menyimpannya di ms notepad dasar sebagai UTF-8, setelah membuka file baru di notepad ++, pengkodeannya diatur ke UTF-8-BOM (yang saya tidak yakin apa artinya). Bagaimanapun, itu tampaknya menjadi masalah bagi saya.
BoltKey

Terima kasih! Ini berhasil. Saya melihat dalam permintaan / tanggapan file (dalam kasus saya, ASPX) dikodekan sebagai UTF-8. Notepad ++ telah di-encode ke UTF-8, juga. Apa-apaan ini, kan? Tapi solusimu berhasil. Bagi saya, itu adalah frasa bahasa Spanyol yang tidak disandikan dengan benar di halaman. Saya sudah membaca di tempat lain untuk tidak menggunakan BOM UTF-8 untuk bahasa Spanyol tetapi memperbaikinya untuk saya.
user3621633

13

Masalah: Bahkan saya menghadapi masalah saat kami mengirim '£' dengan beberapa string dalam permintaan POST ke Sistem CRM, tetapi ketika kami melakukan panggilan GET dari CRM, ia mengembalikan '£' dengan beberapa konten string. Jadi yang kami analisis adalah '£' dikonversi menjadi '£' .

Analisis: Kesalahan yang kami temukan setelah melakukan penelitian adalah bahwa dalam panggilan POST kami telah menetapkan HttpWebRequest ContentType sebagai "teks / xml" sedangkan di GET Call itu "text / xml; charset: utf-8" .

Solusi: Jadi sebagai bagian dari solusi, kami menyertakan charset: utf-8 dalam permintaan POST dan berfungsi.


0

Dalam kasus saya ini (dengan caret) terjadi pada kode yang saya hasilkan dari visual studio menggunakan alat saya sendiri untuk menghasilkan kode. Itu mudah dipecahkan:

Pilih satu spasi () dalam dokumen. Anda harus dapat melihat banyak ruang tunggal yang terlihat berbeda dari ruang tunggal lainnya, mereka tidak dipilih. Pilih satu ruang lain ini - mereka yang bertanggung jawab atas karakter yang tidak diinginkan di browser. Pergi ke Temukan dan Ganti dengan spasi tunggal (). Selesai

PS: Lebih mudah untuk melihat semua karakter serupa ketika Anda menempatkan kursor pada satu atau jika Anda memilihnya di VS2017 +; Saya harap IDE lain mungkin memiliki fitur serupa


-1

Dalam kasus saya, saya mendapatkan tanda silang latin alih-alih nbsp, meskipun halaman itu dikodekan dengan benar ke dalam UTF-8. Tidak ada yang di atas membantu dalam menyelesaikan masalah dan saya mencoba semua.

Pada akhirnya mengubah font untuk IE (dengan browser spesifik css) membantu, saya menggunakan Helvetica-Nue sebagai font tubuh yang berubah menjadi Arial menyelesaikan masalah.


Alasan mengapa beralih font mungkin membantu mungkin karena salah satu font tidak mengandung karakter yang dipermasalahkan, jadi yang Anda lihat adalah karakter kosong. Tapi ini tidak menyelesaikan masalah, hanya menutupinya.
Oliver Hausler

-2

Saya mengalami masalah yang sama. Ternyata itu hanya karena PHP tidak mengenali utf-8.

Awalnya saya merobek rambut saya ketika tanda '£' terus muncul sebagai '£', meskipun itu tampak oke di DreamWeaver. Akhirnya saya ingat saya telah mengalami masalah dengan tautan relatif ke file indeks, ketika halaman, jika dilihat langsung akan bekerja dengan tayangan slide, tetapi tidak ketika digunakan dengan menyertakan (tapi itu intinya. Pokoknya saya bertanya-tanya apakah ini mungkin sebuah masalah serupa, jadi alih-alih menempatkan ke halaman yang saya punya masalah dengan, saya hanya memasukkannya ke file index.php - masalah diperbaiki di seluruh.



-2

Yah saya juga mendapatkan Masalah ini di beberapa situs web saya dan semua yang perlu saya lakukan adalah menyesuaikan fetler konten untuk entites HTML. sebelum itu lebih banyak saya menghapus lebih banyak yang saya dapatkan, jadi ubah saja Anda html fiter atau fungsi parsing untuk halaman dan itu berhasil. Ini terutama disebabkan oleh editor HTML di sebagian besar CMS. cara mereka menyimpan parse data yang menyebabkan masalah ini (Dalam kasus saya). Semoga ini akan membantu dalam kasus Anda juga

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.