2012-08-03 27 views
7

Pracuję ze stroną internetową, w której zmieniłem zestaw znaków z iso-8859-1 na utf-8. W górnej części strony brzmi tak:Pojedyncze cudzysłowy pokazane jako znak zapytania w kształcie rombu w przeglądarkach (brak bazy danych lub PHP)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>[title of site]</title> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

Używam tylko znaki ASCII na stronie, a ponieważ UTF-8 nadzbiorami kodowania ASCII, to powinno być w porządku. Jednak pojedyncze cytaty w tekście są wyświetlane jako znaki zapytania otoczone czarnymi diamentami. Zweryfikowałem, że są to pojedyncze cytaty ASCII (nie proste cytaty).

Czytałem dużo w Internecie, który opisuje rozwiązania problemu, który obejmuje PHP, magiczne cytaty, konfigurację bazy danych, itp. Jednak jest to płaska strona HTML, która nie jest renderowana przez żadne programy.

Ponadto, wielu osobom mającym ten problem poproszono o przejście na UTF-8 w celu rozwiązania problemu. Właśnie w ten sposób I wprowadził problem w postaci.

Proszę spojrzeć na http://mch.blackcatwebinc.com/src/events.html, aby zobaczyć ten problem.

+0

Jak te słowa pojawiają się w bazie danych? – deex

+0

Źródło strony ma ** nie ** mają pojedyncze cudzysłowy ASCII. Cokolwiek umieścić tekst tam zmienił je w coś innego, jeśli rzeczywiście są one pojedyncze cytaty ASCII w oryginalnym źródle (co szczerze wątpię). – tripleee

Odpowiedz

5

Jedyne cytaty w ASCII to pojedynczy cudzysłów "(0x27 lub 39) i podwójny cudzysłów" (0x22 lub 33) .Jest tam 8-bitowe kodowanie, które umieszcza cudzysłowy na 145 (0x91) i 146 (0x92) o nazwie CP1252, jest to standardowe 8-bitowe kodowanie w Europie Zachodniej dla systemu Windows, jeśli to, co chcesz, to UTF-8, musisz przekonwertować to na kodowanie UTF-8, ponieważ nie jest ono poprawne w UTF-8, poprawne użycie UTF-8 wiele bajtów dla znaków powyżej 127 (0x7F) i umieszcza otwierające i zamykające cytaty odpowiednio na U + 2018 i U + 2019.

+0

Wszyscy masz rację. Sprawdziłem tekst w vimie, który "maskował objawy" - pokazywał cytaty jako pojedyncze cytaty, ponieważ odczytał plik jako CP1252. Zrobiłem "zestaw encoding = utf8" i zapisałem plik, a pojedyncze cytaty pojawiły się jako <92> - tj. Cytaty jako ich odpowiedniki heksagonalne CP1252. Po zmianie na pojedyncze cudzysłowy ASCII (UTF-8) wszystko było w porządku. Muszę również ustawić IDE, CodeLobster, aby zapisać wszystkie pliki w UTF-8. – blackcatweb

0

Jedyna różnica między tagiem a tagiem na stronie, nad którą pracuję, to spacja po średniku i to, że utf jest małe na twojej. Spróbuj wpisać wielką literę w łańcuchu znaków.

+0

Po prostu wypróbowałem to lokalnie - bez efektu. Wciąż są tam te znaki zapytania. – blackcatweb

+0

-1 Sprawa nie ma znaczenia tutaj. – tripleee

0

Wszystkie znaki drukowalne ASCII mają równoważny kod encji HTML. Niektóre z tych znaków są zwykle obsługiwane przez większość popularnych krojów pisma systemowego, niektóre z nich są kategoryzowane jako symbole, które prowadzą nas do problemu z renderowaniem.

Co ty podobno mają tam jest zamykania apostrof, w celu uzyskania słusznie drukowane należy użyć jego kod podmiotu lub & # 146; odpowiednio. Jeśli okaże się, że jest to otwierający pojedynczy cytat, należy użyć & # 145; zamiast.

Uwaga: nie ma nazwy jednostki HTML dla dwóch znaków ASCII (i some more), więc musisz wybrać wariant kodu jednostki.

+0

Nie ma czegoś takiego, jak pojedynczy cudzysłów zamykający ASCII. Tylko znaki poniżej 128 to ASCII. – prosfilaes

+0

Jeśli masz na to imię XXI w., Z przyjemnością zaktualizuję powyższą odpowiedź. Proszę, po prostu nie mów apostrofu. – Xhezairi

+3

To zamykający pojedynczy cytat. Może być zakodowany w CP1252 lub Unicode lub prawdopodobnie w kilku innych kodowaniach znaków. To nie jest ASCII. – prosfilaes

1

Kod źródłowy jest nie zapisany w UTF-8, ale łacińskich 1 CP1252, a te cytaty są nie proste cytaty ale U + 2019 PRAWO apostrofami (zakodowane w Latin1). Zapisz plik źródłowy w UTF-8 i zadziała.

+1

To nie jest łacina-1. Jest to strona kodowa Windows 1252. W większości zastosowań CP1252 jest nadzbiorem Latin-1, ale nadal nie jest taki sam. – prosfilaes

+0

W porządku, cokolwiek to jest, nie jest to kodowanie UTF-8, mimo że jest zadeklarowane jako UTF-8. Właśnie przełączyłem przeglądarkę na Latin-1 i wyświetliłem ją poprawnie, co jest po prostu klasycznym przypadkiem deklarowanego kodowania, a faktyczne kodowanie nie jest takie samo. – deceze

+0

CP1252 był tak często używany w Latin-1, że większość przeglądarek traktuje Latin-1 jak CP1252, a HTML5 to robi. – prosfilaes

1

Najprostszą poprawką jest zmiana UTF-8 na Windows-1252 w tagu meta. Działa to, ponieważ serwer nie ogłasza żadnego kodowania w nagłówku Content-Type, więc przeglądarki i inni klienci będą używać tego, który określono w znaczniku meta.

Nazwa Windows-1252 jest preferowaną nazwą MIME dla 8-bitowego kodowania Windows Latin-1, znanego również jako cp1252 i kilku innych nazw (często błędnie przedstawianych jako "ANSI").

Jak wyjaśnia @deceze, rzeczywiste kodowanie danych to Windows-1252, a nie UTF-8. Alternatywnie można zmienić faktyczne kodowanie na UTF-8, zapisując plik za pomocą odpowiedniego polecenia w oprogramowaniu do authoringu. Ale najważniejsze jest to, że deklarowane kodowanie pasuje do prawdziwego.

Jeszcze inną możliwością jest użycie "ucieczek" do apostrofu, takich jak &rsquo;. Działają niezależnie od kodowania, ale powodują, że kod źródłowy jest mniej czytelny.

+0

To zadziałało dla mnie, dziękuję. :) – InkHeart

Powiązane problemy