2011-12-02 11 views
17

Przeniosłem swoją witrynę z mojego lokalnego serwera testowego do hostingu dzielonego NameCheap, a teraz mam problem - niektóre strony nie wyświetlają prawidłowo znaków specjalnych UTF-8 (pokazując pytanie znaki zamiast). Wszystkie strony są zakodowane w UTF-8, podobnie jak wszystkie tabele bazy danych. Dziwne jest to, że niektóre strony wyświetlają się poprawnie, a inne nie, w pozornie losowym wzorze.Znaki specjalne UTF-8 nie wyświetlają się

Na przykład moja strona indeksu jest w porządku, ale moja strona profilu nie jest. faq.html działa dobrze, ale kiedy zmieniam nazwę na faq.php, nie działa. I najdziwniejsze ze wszystkich, mam stronę z dwiema zakładkami JQuery, gdzie jedna wyświetla się poprawnie, a druga nie!

Czy ktoś może mi w tym pomóc?

+1

Czy sprawdziłeś kodowanie za pomocą Narzędzi dla programistów? (F12 w większości przeglądarek) –

+0

Tak, mówi się, że to utf-8 dla wszystkich stron. – robert

Odpowiedz

42

To naprawdę denerwujący problem do naprawienia, ale możesz spróbować.

Przede wszystkim upewnij się, że plik jest rzeczywiście zapisany w formacie UTF-8.

Następnie sprawdź, czy masz <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> w nagłówku HTML.

Możesz także spróbować wywołać header('Content-Type: text/html; charset=utf-8'); na początku swojego skryptu PHP lub dodać AddDefaultCharset UTF-8 do pliku .htaccess.

+1

Mam metatag, który określa charset = utf-8 w moim nagłówku. Dodanie AddDeafultCHarset UTF-8 do mojego .htaccess nie pomoże. Wolę unikać rozwiązania bezpośrednio z kodu PHP, ponieważ jest to dość skomplikowana strona. – robert

+4

Mój problem polegał zwykle na tym, że rzeczywiste pliki nie miały formatu UTF-8. Na przykład znak 'ä' z ASCII pojawi się jako' ', jeśli przeglądarka odczyta go jako UTF-8, ale rzeczywisty plik nie jest. – RCE

+0

Rzeczywiste pliki są zdecydowanie utf-8 i działały idealnie na moim EasyPHP. – robert

6

Wygląda na to, że jeśli zażądasz faq.html, serwer WWW sygnalizuje przeglądarce, że plik jest w kodowaniu UTF-8.

Sprawdź w przeglądarce, które kodowanie jest ogłaszane i używane, zapoznaj się z dokumentacją przeglądarki, jak to zrobić. Każda przeglądarka ma to, najczęściej dostępne za pośrednictwem menu (aby określić preferencje, które kodowanie strony powinno być używane) i aby zobaczyć, co serwer zwrócił, często można to znaleźć we właściwościach strony.

To brzmi tak, jeśli poprosisz faq.php, że serwer internetowy wyświetli Twoją przeglądarkę, że plik jest w innym kodowaniu. Prawdopodobnie nie ma żadnego zestawu znaków/kodowania, jak w domyślnym ustawieniu konfiguracji PHP. Jako, że jest to plik PHP można najczęściej rozwiązać ten problem poprzez zmianę konfiguracji PHP dyrektywę default_charsetDocs:

default_charset = "UTF-8" 

Zlokalizuj php.ini na hoście i edytować go odpowiednio.

Jeśli nie masz php.ini dostępny, można to zmienić za pomocą kodu, jak również za pomocą ini_setDocs funkcję:

ini_set('default_charset', 'UTF-8'); 

zadbać, że to bardzo wcześnie, bo w skrypcie PHP zmiany musi mieć możliwość wysyłania nagłówków, aby działało poprawnie, a nagłówków nie można ustawiać dłużej, jeśli zostały już wysłane.

Ręczne wysyłanie Content-Type nagłówek wiersza działa też:

header('Content-Type: text/html; charset=UTF-8'); 

Dodatkowo jest to dobra praktyka, aby wszystkie strony html wyjściowe mają ten nagłówek, jak również w ich sekcji HTML <head>:

<html> 
    <head> 
    ... 
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> 
    ... 

Mam nadzieję, że to jest pomocne.

+0

Dzięki, ale nie mam dostępnego php.ini. Przeglądarka mówi, że kodowanie jest utf-8, i wyświetla to samo we wszystkich przeglądarkach. Mam odpowiednie kodowanie zadeklarowane w nagłówku. Próbowałem mimo to dodać go do .htaccess, ale to nic nie znaczyło.Czy uważasz, że to może być problem z kontem hostingowym? – robert

+0

Użycie ini_set wyświetla znaki, ale nie odczytuje wtedy żadnej zawartości PHP! – robert

+0

Jeśli przeglądarka zgłasza kodowanie UTF-8 i nie wyświetla się prawidłowo, dane są gdzieś uszkodzone. Kodowanie jest jak łańcuch, jeśli jeden element jest nieprawidłowy, wynik końcowy jest nieprawidłowy. Uważaj i znajdź element łańcucha, który nie działa. A co rozumiesz przez "dowolną treść PHP"? – hakre

3

zestaw meta tag w głowie jak

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

użyj linku http://www.i18nqa.com/debug/utf8-debug.html zastąpić symbole znak.

następnie użyć str_replace jak

$find = array('“', '’', '…', '—', '–', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash 
         $replace = array('“', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '”'); 
$content = str_replace($find, $replace, $content); 

Jego metody używam i pomóc dużo. Dzięki!

0

Jeśli wszystkie pozostałe odpowiedzi nie były dla Ciebie skuteczne, spróbuj wyłączenie translacji kodu wejściowego HTTP. To jest ustawienie związane z rozszerzeniem PHP mbstring. To był problem w moim przypadku. To ustawienie zostało domyślnie włączone na moim serwerze.

2

Jeśli używasz PHP i żaden z powyższych nie zadziałał (tak jak było w moim przypadku), musisz ustawić locale z kodowaniem UTF-8.

Ci się to

setlocale(LC_ALL, 'fr_CA.utf-8'); 
1

Problemem jest to, ponieważ plik nie są z tego samego kodowania. Najpierw uruchom następujące polecenie na wszystkich plikach:

file -i filename.* 

Aby rozwiązać ten problem, musisz zmienić wszystkie swoje pliki do UFT-8. Można to zrobić z iconv polecenia:

iconv -f fromcode -t tocode filename > newfilename 

Przykład:

iconv -f iso-8859-1 -t utf-8 index.html > fixed/index.html 

Po tym można uruchomić plik -i fixedx/index.html i widać, że plik jest już w uft- 8