2012-12-29 22 views
10

Mam kilka tekstów w języku francuskim (zawierających znaki akcentowane, takie jak "é"), przechowywane w tabeli MySQL, której sortowanie to utf8_unicode_ci (zarówno tabela, jak i kolumny), które chcę wyprowadzić na Strona HTML5.Znaki akcentowane w tabeli mySQL

Zestaw znaków strony HTML to UTF-8 (< meta charset = "utf-8" />), a same pliki PHP są zakodowane jako "UTF-8 bez LM" (używam Notepad ++ w systemie Windows). Używam PHP5 do żądania bazy danych i generowania kodu HTML.

Jednak na stronie wydruku znaki specjalne (takie jak "é") są zniekształcone i zastępowane przez " ".

Podczas przeglądania bazy danych (za pośrednictwem phpMyAdmin) te same znaki akcentowane są wyświetlane poprawnie.

Czego mi tu brakuje?

(Uwaga: zmiana kodowania strony (poprzez menu przeglądarki internetowej Firefoksa) na ISO-8859-1 rozwiązuje problem ... z wyjątkiem znaków specjalnych pojawiających się bezpośrednio w plikach PHP, które stają się teraz uszkodzone. W każdym razie wolałbym zrozumieć, dlaczego nie działa on jako UTF-8 niż zmiana kodowania bez zrozumienia, dlaczego to działa. ^^;)

+0

Możesz też spróbować wysłać do niego nagłówek ze strony php. –

Odpowiedz

29

przeżyłem ten sam problem przed, i to, co zrobiłem, są następujące

1) Za pomocą Notepad ++ (może prawie adaptacji na dowolnym kodowaniem) lub eclipse i upewnij się, by zapisać lub otworzyć go w UTF-8 bez BOM.

2) ustawić kodowanie w nagłówku PHP, używając header('Content-type: text/html; charset=UTF-8');

3) usunąć dodatkowe spacje na początku i na końcu moich plików PHP.

4) ustaw wszystkie moje tablice i kolumny kodujące na utf8mb4_general_ci lub utf8mb4_unicode_ci za pośrednictwem PhpMyAdmina lub dowolnego klienta mySQL, który posiadasz. Porównanie dwóch kodowań są dostępne here

5) zestaw mysql połączenie charset na UTF-8 (Używam PDO dla mojego połączenia z bazą danych)

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" 
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8" 

lub po prostu wykonać zapytań SQL przed pobierania jakichkolwiek danych

6) używać meta tag <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

7) stosowanie pewien kod języka dla języka francuskiego <meta http-equiv="Content-language" content="fr" />

8) zmiana elementu HTML lang atrybut do żądanego języka

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> 

i będzie aktualizacji tego więcej, bo naprawdę trudno było rozwiązać ten problem wcześniej, bo miałem do czynienia z japońskich znaków w moich wcześniejszych projektów

9) Niektóre czcionki nie są dostępne w komputerze klienckim, trzeba użyć Google fonts aby umieścić go na swojej CSS

10) nie kończ plik źródłowy PHP z ?>

UWAGA:

ale jeśli wszystko powiedziałem powyżej nie działa, spróbuj wyregulować kodowania w zależności od zestawu znaków naprawdę chcesz wyświetlić, dla mnie ustawić wszystko SHIFT-JIS aby wyświetlić wszystkie moje japońskie postacie i to naprawdę działa dobrze. Ale za pomocą UFT-8 musi być priorytetem

+6

+1 dla 'SET NAMES', powszechny błąd –

+1

Tak,' SET NAMES' jest prawdopodobnie jego problemem. – tftd

+4

Rzeczywiście brakowało "SET NAMES" i dodanie go było wystarczające, aby poprawić mój problem. Ponieważ nie używam PDO, musiałem użyć następującej składni: 'mysql_query ('SET NAMES utf8');'. Wielkie dzięki za szczegółową odpowiedź! – s427

2

Jeśli twój php.inidefault_charset nie jest ustawiony na UTF-8, potrzebujesz użyć Content-type do zdefiniowania swoich danych. Zastosować następujący nagłówek na początku pliku (ów):

header("Content-type: text/html; charset=utf-8"); 

Jeśli nadal kłopoty z kodowaniem, przyczyną może być jedną z następujących czynności:

  • problem serwer charset bazy danych (sprawdzić kodowanie serwera)
  • problem charset klienta bazy danych (kodowanie sprawdzić połączenia)
  • problem tabeli bazy danych charset (sprawdź kodowanie tabeli)
  • z DEFA php Problem kodowania zą (kontrola default_encoding parametr w parameters.ini)
  • wielobajtowego missconfigured (patrz mb_string parametry parameters.ini)
  • <form> problemów zestawu znaków (upewnić się, że jest on przesyłany UTF-8)
  • <html> problem z zestawem znaków (gdzie nie ma ustawionego typu enctype w pliku html)
  • a Content-encoding: problem (gdzie błędne kodowanie jest wysyłane przez Apache).
+0

Dzięki za odpowiedź. Problem rozwiązany przez dodanie polecenia 'SET NAMES' po połączeniu z bazą danych. – s427

14

Działa to dla mnie

  1. Dodać bazie utf8_general_ci
  2. zapisywać pliki w N ++ jako UTF-8 without BOM
  3. Put $mysqli->query('SET NAMES utf8'); po podłączeniu do bazy danych w pliku PHP
  4. Put < meta charset="utf-8" /> w twoim HTML-ie

Działa idealnie.

+0

Dzięki za odpowiedź. Wystąpił problem braku "SET NAME". – s427

+0

Zaoszczędź bez BOM w sublime, dzięki czemu działa !!!!!!!!! –

+0

Dziękuję człowieku !, bardziej zsyntetyzowanym niż pierwsza odpowiedź. :) –

1
  1. Rodzaj coś pełne znaki francuskie w swoim (PHP) plik
  2. Zapisz ten plik jako linia Wklej UTF-8
  3. pod na swojej stronie nagłówka

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

Strona (plik) powinna wyglądać dobrze.

Jeśli wygląda dobrze, przejdź do here dla zachowania mysql po (SET_NAMES).

+0

Dziękuję za odpowiedź. Problem rozwiązany. Rzeczywiście brakowało mi "SET NAME". – s427

2

SET NAMES dla mnie.

Mój problem był na jednej z moich stron edycji, pole z obcymi znakami nie wyświetlało się, na stronach internetowych produkcji nie było problemu.

1

Wiem, że już masz odpowiedź. To wspaniale. Ale dziwnie żadna z tych odpowiedzi nie rozwiązała mojego problemu. Chciałbym podzielić się moją odpowiedzią z korzyścią dla innych, którzy mogą napotkać te same problemy.

Miałem te same problemy co OP, w odniesieniu do francuskich akcentów w aplikacji wielojęzycznej.

Ale napotkałem ten problem po raz pierwszy, kiedy musiałem przekazać (francuski akcentowane) dane jako segmenty połączeń AJAX.

Tak, musimy mieć bazę danych skonfigurowaną do pracy z UTF8. Ale fakt, że wywołania AJAX miały ciągi zapytań (w moim przypadku segmentów, ponieważ używam CodeIgniter), musiałem po prostu kodować francuski tekst.

Aby to zrobić po stronie klienta, użyj funkcji JavaScript encodeURI() z danymi.

I odwrócić go w PHP, wystarczy użyć urldecode($MyStr), gdzie dane zostały odebrane jako parametry.

Mam nadzieję, że to pomoże.