HTML kodlama sorunları - “& nbsp;” yerine “” karakteri görünüyor


204

Emin olmamakla birlikte, yanlış davranmaya başlayan eski bir uygulamam var. ActivePDF tarafından PDF raporlarına dönüştürülen bir grup HTML oluşturur.

İşlem şu şekilde çalışır:

  1. Değiştirilecek jetonları olan bir DB'den bir HTML şablonu çekin (örn. "~ CompanyName ~", "~ CustomerName ~", vb.)
  2. Jetonları gerçek verilerle değiştirin
  3. HTML kod özniteliği değerlerini biçimlendiren basit bir normal ifade işleviyle HTML'yi düzenleyin (ActivePDF'nin oluşturma motoru, öznitelik değerleri etrafında tek tırnaktan başka bir şeyden nefret ettiğinden, tırnak işaretleri vb. Sağlar)
  4. HTML'yi PDF'yi oluşturan bir web hizmetine gönderin.

Bu karışıklıkta bir yerde, HTML şablonundan / şablonlarından kopmayan boşluklar  , belgeyi bir tarayıcıda (FireFox) görüntülerken yanlış bir "Â" karakteri olarak görünmeleri için ISO-8859-1 olarak kodlanıyor. ActivePDF, UTF8 olmayan bu karakterleri gösterir.

Sorum: Sorunun nereden kaynaklandığını bilmediğimden ve araştırmak için zamanım olmadığından, kötü karakterleri yeniden kodlamanın veya bulmanın ve değiştirmenin kolay bir yolu var mı? Birlikte attığım bu küçük işlevle göndermeyi denedim, ama her şeyi gobbledegook'a çevirir hiçbir şey değiştirmez.

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

Herhangi bir fikir?

DÜZENLE:

Şimdilik bununla uğraşıyorum, ancak iyi bir çözüm gibi görünmüyor:

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

2
HTML, karakter kümesini tanımlamak için herhangi bir meta bilgi içeriyor mu?
Rowland Shaw

1
[Önceki yorum silindi] Kısa cevap: hayır.
Cᴏʀʏ

1
Benim için çalıştı: utf8_decode ()
ursuleacv

Yanıtlar:


343

Bu karışıklıkta bir yerde, HTML şablonundan / şablonlarından kopmayan boşluklar ISO-8859-1 olarak kodlanıyor, böylece yanlış bir "Â" karakteri olarak gösteriliyorlar

ISO-8859-1 değil, UTF-8 kodlanıyor. Kesintisiz boşluk karakteri ISO-8859-1'de bayt 0xA0; UTF-8 olarak kodlandığında, 0xC2,0xA0 olur; bu, eğer (yanlış) ISO-8859-1 olarak görürseniz ortaya çıkar " ". Bu, fark etmeyebileceğiniz bir sondaki nbsp'yi içerir; bu bayt orada değilse, başka bir şey belgenizi çekti ve ne olduğunu öğrenmek için daha fazlasını görmemiz gerekiyor.

Normal ifade nedir, şablonlama nasıl çalışır?  Dizeleriniz (doğru) U + 00A0 KESİNTİSİZ BOŞLUK karakterlerine dönüştürülüyorsa, bir yerde uygun bir HTML ayrıştırıcısı var gibi görünüyor . Öyleyse, şablonunuzu DOM'da yerel olarak işleyebilir ve ASCII olmayan karakterleri karakter referansları olarak tutmak için ASCII kodlamasını kullanarak serileştirmesini isteyebilirsiniz. Bu ayrıca, HTML'nin kendisinde normalde son işlem yapmanıza gerek kalmaz, bu da her zaman çok tehlikeli bir iştir.

Her neyse, şimdilik belgenize aşağıdakilerden birini ekleyebilir <head>ve bunun tarayıcıda doğru görünüp görünmediğini görebilirsiniz:

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

Bunu yaptıysanız, kalan herhangi bir sorun ActivePDF'nin hatasıdır.


20
<meta charset="utf-8">Henüz tavsiye etmem . http-equivVersiyon HTML5'teki hala geçerlidir ve daha iyi desteklenir.
bobince



Tüm modern tarayıcılarda çalışır . Kesinlikle tüm eski ve niş (ör. Mobil) tarayıcılarda veya tüm örümceklerde çalışmaz.
bobince

3
“O pisliğin içinde bir yer” ... LOL! Güzel açık! İyi cevap! +1
Direnç Tasarımı

24

Herhangi biri benimle aynı soruna sahipse ve karakter seti zaten doğruysa, bunu yapın:

  1. .Html dosyasının içindeki tüm kodu kopyalayın.
  2. Not defterini (veya herhangi bir temel metin düzenleyicisini) açın ve kodu yapıştırın.
  3. "Dosya -> Farklı Kaydet" e gidin
  4. "Example.html" dosya adını girin ("Kayıt türü: Tüm Dosyalar ( . )" Seçeneğini belirtin )
  5. Kodlama'yı UTF-8 olarak seçin
  6. Kaydet'e basın, artık eski .html dosyanızı silebilirsiniz ve kodlama düzeltilmelidir

2
Bu benim için yaptı. Şimdi UTF-8 with BOMyerine yüce diyor UTF-8. Bunu yüce metinde görmek show_encodingiçin trueAyarlar - Kullanıcı'da ayarlamanız gerekir .
J86

Ben yerine  gösteren sorun vardı, amd Bu çözümü kullanırken Sorun çözüldü ama bir php uyarısı var: 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

Bu çözüm benim için çalıştı. Notepad ++ ile çalışıyordum ve UTF-8 olarak temel ms not defterine kaydettiğimde, notepad ++ 'da yeni dosyayı açtıktan sonra kodlama UTF-8-BOM (ne anlama geldiğinden emin değilim) olarak ayarlanmıştı. Her neyse, bu benim için bir sorun gibi görünüyor.
17:36, BoltKey

Teşekkür ederim! Bu hile yaptı. İstek / yanıt dosya (benim durumumda, ASPX) UTF-8 olarak kodlanmış görüyorum. Notepad ++, UTF-8'e de kodlanmıştı. Ne oluyor, değil mi? Ama hile yaptınız çözüm. Benim için, sayfada düzgün bir şekilde kodlama yapmayan İspanyolca bir ifadeydi. İspanyolca için UTF-8 BOM kullanmamak için başka bir yerde okudum ama benim için sabit.
kullanıcı3621633

14

Sorun: Gönderdiğimiz sorunla bile karşılaşıyordum CRM Sistemi'ne POST isteğinde bazı dize ile '£' , ancak CRM'den GET çağrısını yaparken, bazı dize içeriğiyle 'Â £' döndürüyordu . Analiz ettiğimiz şey, '£' '' Â £ '' ya dönüştürülüyordu .

Analiz: Araştırma yaptıktan sonra bulduğumuz aksaklık POST çağrısında HttpWebRequest ContentType'ı "text / xml" olarak ayarlamışken GET Call'da "text / xml; charset: utf-8" olarak ayarlamış olduğumuzdur .

Çözüm: Çözümün bir parçası olarak POST isteğinde charset: utf-8'i ve çalışıyor.


0

Benim durumumda bu (kodlu bir) kod oluşturmak için kendi aracımı kullanarak görsel stüdyodan oluşturulan kodda meydana geldi. Çözmek kolaydı:

Belgedeki tek boşlukları () seçin. Diğer tek boşluklardan farklı görünen çok sayıda tek boşluk görebilmeniz gerekir, bunlar seçilmez. Bu diğer tek boşlukları seçin - tarayıcıdaki istenmeyen karakterlerden sorumlu olanlardır. Tek boşlukla Bul ve Değiştir'e () gidin. Bitti.

Not: İmleci bir tanesinin üzerine getirdiğinizde veya VS2017 + 'da seçtiğinizde tüm benzer karakterleri görmek daha kolaydır; Umarım diğer IDE'ler benzer özelliklere sahip olabilir


-1

Benim durumumda, bir sayfa UTF-8'e doğru kodlanmış olsa bile, nbsp yerine latin haç işareti alıyordum. Yukarıdakilerin hiçbiri sorunun çözülmesine yardımcı oldu ve hepsini denedim.

Sonunda IE için değişen yazı tipi (tarayıcıya özgü css ile) yardımcı oldu, ben Helvetica-Nue Arial için değişen bir vücut yazı tipi olarak sorunu çözdü.


Yazı tipini değiştirmenin yardımcı olmasının nedeni, yazı tiplerinden birinin söz konusu karakteri içermemesi olabilir, bu nedenle gördüğünüz şey boş bir karakterdi. Ama bu sorunu çözmedi, sadece örtbas etti.
Oliver Hausler

-2

Ben de aynı problemi yaşıyordum. Görünüşe göre PHP sadece utf-8'i tanımıyor.

DreamWeaver'da iyi görünmesine rağmen, '£' işareti 'Â £' olarak görünmeye başladığında saçlarımı yırtıyorum. Sonunda, sayfalar doğrudan görüntülendiğinde slayt gösterileri ile çalışacak, ancak bir içerme ile kullanıldığında değil (ama bu noktanın yanında.) benzer bir sorun, bu yüzden sorunları olan sayfaya koymak yerine, sadece index.php dosyasına koymak - sorun boyunca sabit.



-2

Peki bu sorunu birkaç web sitemde de aldım ve tek yapmam gereken HTML girişleri için içeriği fetler özelleştirmek. ondan önce ben onları daha fazla silmek var, bu yüzden sadece html fiter veya sayfa için ayrıştırma işlevini değiştirmek ve çalıştı. Esas olarak CMS'lerin çoğunda HTML editörleri nedeniyle. veriyi ayrıştırma biçimleri bu soruna neden oldu (Benim durumumda). Bu sizin durumunuzda da yardımcı olabilir mi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.