2009-09-22 9 views
171

Mam starszą aplikację, która zaczyna się źle zachowywać, z jakiegokolwiek powodu nie jestem pewien. Generuje pakiet HTML, który zostaje przekształcony w raporty PDF przez ActivePDF.Problemy z kodowaniem HTML - pojawia się znak "Â" zamiast " "

Proces działa tak:

  1. Pull szablon HTML z DB z tokenów w nim zostać wymienione (np "~ NazwaFirmy ~" "~ CustomerName ~", itd.)
  2. wymienić żetony z prawdziwymi danymi
  3. Tidy HTML z prostej funkcji regex że tag formaty własności HTML wartości (zapewnia cudzysłów, itp, ponieważ silnik renderowania activePDF za znosi niczego, ale pojedyncze cudzysłowy wokół wartości atrybutów)
  4. wysyłaj przypisują HTML do usługi WWW, która tworzy PDF.

gdzieś w tym bałaganie, że non-breaking przestrzenie z szablonu HTML (te   ów) kodującego jako ISO-8859-1, tak aby pokazać się niepoprawnie jako znak „A” podczas wyświetlania dokumentu w przeglądarka (FireFox). ActivePDF pukes na tych znaków spoza UTF8.

Moje pytanie: skoro nie wiem, skąd bierze się ten problem i nie mam czasu na jego zbadanie, czy istnieje łatwy sposób ponownego kodowania lub znajdowania i zastępowania złych znaków? Próbowałem wysłać go przez tę małą funkcję, którą zrzuciłem razem, ale to zamienia to wszystko w gobbledegook nic nie zmienia.

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 

Wszelkie pomysły?

EDIT:

Dostaję przez z tym teraz, choć nie wydaje się dobrym rozwiązanie:

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

Czy kod HTML zawiera metainformacje opisujące jego zestaw znaków? –

+1

[Wcześniejsze skomentowane usunięte] Krótka odpowiedź: nie. –

+0

Dla mnie działało: utf8_decode() – ursuleacv

Odpowiedz

289

gdzieś w tym bałaganie, że non-breaking przestrzenie z szablonu HTML (  s) są kodowane jako ISO-8859-1 tak, że są niepoprawnie wyświetlane jako znak "Â"

To kodowanie do UTF-8, a nie do ISO-8859-1. Nieprzerwany znak spacji to bajt 0x00 w ISO-8859-1; po zakodowaniu do UTF-8 będzie to 0xC2,0xA0, co jeśli (niepoprawnie) wyświetlisz go jako ISO-8859-1, wyświetli się jako " ". Dotyczy to końcowego nbsp, którego możesz nie zauważyć; jeśli tego bajtu nie ma, to coś innego zmiażdżyło twój dokument i musimy zobaczyć dalej, aby dowiedzieć się, co.

Co to jest wyrażenie regularne, jak działa szablon? Wydaje się, że odpowiedni parser HTML jest zaangażowany gdzieś, jeśli twoje ciągi   są (prawidłowo) zamieniane na znaki U + 00A0 NON-BREAKING SPACE. Jeśli tak, możesz po prostu przetworzyć szablon natywnie w DOM i poprosić o serializowanie za pomocą kodowania ASCII, aby zachować znaki spoza ASCII jako odniesienia do znaków. To również powstrzymałoby cię od konieczności przetwarzania postprocesora regex na samym kodzie HTML, co zawsze jest bardzo podejrzanym biznesem.

No tak, teraz można dodać jedną z następujących czynności, aby Twój Document <head> i zobaczyć, czy to sprawia, że ​​wygląda dobrze w przeglądarce:

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

Jeśli to zrobiłeś, to pozostały problem to błąd ActivePDF.

+40

'' w HTML5 –

+15

Nie polecam '' jeszcze. Wersja 'http-equiv' jest nadal poprawna w HTML5 i jest lepiej obsługiwana. – bobince

+7

Odpowiedzi od [Który używać: vs

19

Jeśli ktoś miał ten sam problem jak ja i charset już prawidłowe, po prostu to zrobić:

  1. Skopiuj cały kod w pliku .html.
  2. Otwórz notatnik (lub dowolny podstawowy edytor tekstu) i wklej kod.
  3. Go "Plik -> Zapisz jako"
  4. Wprowadź złożyć nazwę "example.html" (wybierz "Zapisz jako typ: Wszystkie pliki ().")
  5. Wybierz Kodowanie UTF-8
  6. Hit Zapisz i można teraz usunąć stary plik .html i kodowanie powinno być ustalone
+1

Zrobiłem to za mnie. Teraz w sublime jest napisane 'UTF-8 with BOM' zamiast' UTF-8'. Aby zobaczyć to w wysublimowanym tekście, musisz ustawić 'show_encoding' na 'true' w Ustawieniach - Użytkownik. – Ciwan

+0

Wystąpił problem z wyświetleniem symbolu  zamiast », amd Podczas korzystania z tego rozwiązania problem został rozwiązany, ale istnieje ostrzeżenie php:' Ostrzeżenie: session_start(): Nie można wysłać ogranicznika pamięci podręcznej sesji - nagłówków już wysłanych (dane wyjściowe zaczynają się od D: \ Pliki programów \ wamp \ wamp \ www \ projects \ kerala \ kerala_public_html \ edit \ business_details.php: 1) w D: \ Program Files \ wamp \ wamp \ www \ projects \ kerala \ kerala_public_html \ user \ include \ fg_membersite.php on linia 152' – SCC

+0

zadziałała dla mnie. świetnie: D –

-1

W moim przypadku był już znak krzyża łacińskiego zamiast nbsp, mimo że strona została prawidłowo zakodowany w UTF-8 . Nic z powyższych nie pomogło w rozwiązaniu problemu i spróbowałem wszystkich.

W końcu zmieniłem czcionkę dla IE (z css z przeglądarką), użyłem Helvetica-Nue, ponieważ zmiana czcionki ciała na Arial rozwiązała problem.

-2

Miałem ten sam rodzaj problemu. Wygląda na to, że PHP nie rozpoznaje utf-8.

Początkowo wydzierałem sobie włosy, kiedy znak "£" ciągle pokazywał się jako "£", mimo że wyglądał dobrze w DreamWeaver. W końcu przypomniałem sobie, że miałem problemy z linkami w stosunku do pliku indeksu, kiedy strony, jeśli były oglądane bezpośrednio, działałyby z pokazami slajdów, ale nie w przypadku użycia z włączeniem (ale to jest poza kwestią.) W każdym razie zastanawiałem się, czy to może być podobny problem, więc zamiast umieszczać na stronie, z którą miałem problemy, po prostu umieszczam ją w pliku index.php - problem został naprawiony przez cały czas:

6

Problem: Nawet byłem w obliczu problemu, gdzie byliśmy wysyłanie „£” z jakimś ciągiem na żądanie POST do systemu CRM, ale kiedy robiliśmy rozmowę uzyskać z CRM, to wracał „£ " z pewną zawartością napisu. Tak więc analizowaliśmy, że "£" zostało przekształcone w "Â £".

Analiza: Glitch które odkryliśmy, po zrobieniu badań jest to, że wywołanie POST stworzyliśmy HttpWebRequest ContentType jako "text/xml" podczas Get Zadzwoń Było „text/xml; charset: utf-8 ".

Rozwiązanie: Więc jako część rozwiązania zawarliśmy z charset: UTF-8 w żądaniu POST i to działa.

-1

Cóż, mam ten problem również w moich kilku witrynach internetowych i wszystko, co muszę zrobić, to dostosować zawartość pobierania dla HTML. przed tym więcej i usuń je więcej dostałem, więc po prostu zmień funkcję html fiter lub parsowania dla strony i zadziałało. Głównie z powodu edytorów HTML w większości CMS-ów. sposób, w jaki przechowują dane, spowodował ten problem (w moim przypadku). Może to pomogłoby w twoim przypadku.