2013-04-09 4 views
6

Mam tabelę zawierającą znaki specjalne takie jak ™.Uzyskiwanie znaków specjalnych z bazy danych MySQL za pomocą PHP

Znak ten można wprowadzać i wyświetlać za pomocą phpMyAdmina i innego oprogramowania, ale kiedy używam instrukcji SELECT w PHP do wyprowadzania do przeglądarki, otrzymuję diament z pytającym znakiem.

Typ tabeli to MyISAM. Kodowanie to kodowanie UTF-8 Unicode. Sortowanie to utf8_unicode_ci.

Pierwsza linia głowy HTML jest

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

Próbowałem przy użyciu funkcji() htmlentities na strunie przed wyprowadzanie go. Brak szczęścia.

Próbowałem też dodanie tego do php przed każdym wyjściem (bez różnicy):

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

Wreszcie próbowałem dodanie tego prawa poniżej początkowego połączenia mysql (spowodowało to dodatkowe znaki nieparzyste są wyświetlane):

$db_charset = mysql_set_charset('utf8',$db); 

Co przeoczyłem?

+2

Nie ma związku z samym pytaniem, ale należy użyć 'mysqli' lub PDO zamiast rozszerzenia' myysql', które jest przestarzałe. –

+0

Czy jesteś pewien, że cokolwiek jest w twojej bazie danych, jest faktycznie utf8? –

+0

[Obsługa Unicode z przodu do tyłu w aplikacji sieciowej] (http://kunststube.net/frontback/) – deceze

Odpowiedz

6

Poniższy kod działa dla mnie.

$sql = "SELECT * FROM chartest"; 
mysql_set_charset("UTF8"); 
$rs = mysql_query($sql); 
header('Content-type: text/html; charset=utf-8'); 
while ($row = mysql_fetch_array($rs)) { 
    echo $row['name']; 
} 
+0

arg! "mysql_set_charset (" UTF8 ");" DID rozwiązać problem. Po prostu nie podczas używania htmlentities(). Nie zdawałem sobie sprawy, że htmlentities() TAKŻE wymaga określenia zestawu znaków, jak omówiono tutaj: http://stackoverflow.com/questions/9103801/htmlentities-converts-trademark-into-acirccent –

0

Istnieje kilka rzeczy, które mogą pomóc. Po pierwsze, nawet jeśli ustawiasz zestaw znaków na UTF-8 w nagłówku, może to nie wystarczyć. Widziałem, że przeglądarka zignorowała to wcześniej. Spróbuj zmuszając go dodając to w głowie swojej HTML:

<meta charset='utf-8'> 

Następny, jak wspomniano here, spróbuj to zrobić:

mysql_query ("set character_set_client='utf8'"); 
mysql_query ("set character_set_results='utf8'"); 
mysql_query ("set collation_connection='utf8_general_ci'"); 

EDIT

Więc ja po prostu zrobić niektórzy czytają trochę zabawę. Najpierw pozwól, że ci powiem, pomimo tego, o czym wspomniałem w komentarzach, utf8_encode() i utf8_decode() nie pomogą ci tutaj. Pomaga właściwie zrozumieć kodowanie UTF-8. Znalazłem bardzo przydatną stronę Wikipedii pod adresem UTF-8. Zakładając, że wartość, którą otrzymujesz z bazy danych, jest już zakodowana w systemie UTF-8 i po prostu zrzucasz ją zaraz po jej uzyskaniu, wtedy powinno być dobrze.

Jeśli coś robisz z wynikiem bazy danych (w szczególny sposób manipulując łańcuchem) i nie korzystasz z funkcji unicode aware z biblioteki PHP mbstring, to prawdopodobnie zepsuje to, ponieważ standardowe funkcje ciągu PHP nie są świadomi Unicode.

Kiedy zrozumiesz jak kodowanie UTF-8 działa można zrobić coś fajnego tak:

$test = "™"; 
for($i = 0; $i < strlen($test); $i++) { 
    echo sprintf("%b ", ord($test[$i])); 
} 

Które wysypisk coś takiego:

11100010 10000100 10100010 

To jest poprawnie zakodowany w UTF-8 " ™ ". Jeśli nie masz takiej postaci w swoich danych pobranych z bazy danych, coś jest pomieszane.

Aby sprawdzić, spróbuj wyszukać szczególny charakter, który na pewno w wyniku korzystania mb_strpos():

var_dump(mb_strpos($db_result, '™')); 

Jeśli zwróci coś innego niż false wówczas dane z bazy danych jest w porządku, w przeciwnym razie możemy na najmniej ustalić, czy jest to problem między PHP a bazą danych.

+0

Nie było żadnej zmiany po dodaniu . Po dodaniu innych rzeczy problem się pogarszał. Zamiast " " for ™ otrzymałem "â ¢". –

+0

Aby upewnić się, że kodowanie znaków na stronie jest ustawione prawidłowo, jeśli używasz firefox, kliknąłeś prawym przyciskiem myszy na stronie i kliknąłeś "Wyświetl informacje o stronie", gdzie pokazano kodowanie. Czy wyświetla "UTF-8" lub coś w stylu "ISO-8859-1"? –

+0

Nie jestem ekspertem od kodowania znaków, ale już wcześniej pracowałem. Nie wiem, czy to pomoże, ale prawdopodobnie powinieneś sprawdzić niektóre funkcje PHP podobne do unicode, takie jak [utf8_decode] (http://php.net/manual/en/function.utf8-decode.php) i Funkcje [mbstring] (http://php.net/manual/en/book.mbstring.php). –

-2

Najpierw należy wykonać następujące zapytanie.

mysql_query("SET NAMES utf8"); 
+0

Nie używaj tego, może to powodować problemy z wstrzykiwaniem SQL w pewnych okolicznościach. Użyj "oficjalnego" API 'mysql_set_charset', który OP już robi. – deceze

+0

Ale myślę, że [to pytanie/odpowiedź] (http://stackoverflow.com/a/7073506) mówi dokładnie odwrotnie? –