Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] cyrylica na stronie
Forum PHP.pl > Forum > Przedszkole
jakkolwiek
Witam,
mam problem z wyświetlaniem cyrylicy na stronie. W bazie MySQL mam ustawione strony kodowania i porównywania tekstów na kolejno UTF-8 i utf8_general_ci. Pola w tabeli, w której przetrzymywane są dane zapisane cyrylicą - ustawione jest na utf8_general_ci. Strona ze skryptem, który wprowadza te dane do tabel - ma ustawione kodowanie na utf-8. Strona, na której powinien być wyświetlony tekst w cyrylicy - kodowanie ustawione na utf-8. Mimo tego wszystkiego, na stronie widzę same znaki zapytania. Nie wiem już co zrobić, bardzo proszę o jakieś naprawadzenie na rozwiązanie albo radę...
vokiel
A czy przy łączeniu z bazą ustawiasz kodowanie połączenia?
  1. SET NAMES utf8;
  2. SET character_set_connection=utf8;
  3. SET character_set_client=utf8;
  4. SET character_set_results=utf8;


btw: Polskie znaki na stronie www
cojack
Spróbuj zapisywać do bazy danych poprzez htmlspecialchars z ENT_QUOTES i UTF-8, a odczytuj i wyświetlaj za pomocą: htmlspecialchars_decode i ENT_QUOTES. Powinno pomóc, sprawdź jeszcze czy plik też jest kodowany w utf8.
jakkolwiek
Spróbowałem tego co obaj piszecie, najpierw kolejno później i jedną i drugą metodę i efekt jest taki sam jak poprzednio - same znaki zapytania.

Fragment kodu skryptu, który uploaduje do bazy
  1. $c = mysql_connect('localhost', 'root', '');
  2. $s = mysql_select_db('nhm');
  3. $n = mysql_query("SET NAMES 'utf8'");
  4. mysql_query('SET character_set_connection=utf8');
  5. mysql_query('SET character_set_client=utf8');
  6. mysql_query('SET character_set_results=utf8');
  7. $uchwyt = fopen($_GET['np'].".csv", 'r');
  8. if($delete = mysql_query("DROP TABLE t_nhm_new;") &&
  9. mysql_query("CREATE TABLE t_nhm_new (
  10. nhm VARCHAR( 8 ) NOT NULL ,
  11. definition TEXT NOT NULL ,
  12. language INT( 2 ) NOT NULL ,
  13. decode_definition TEXT NOT NULL
  14. ) ENGINE = MYISAM;") &&
  15. mysql_query("ALTER TABLE t_nhm_new CHANGE definition definition TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
  16. CHANGE decode_definition decode_definition TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;")) {
  17. echo("<b>DELETE<font color='green'> ok</font><br></b>");
  18. } else {
  19. }
  20.  
  21. while(($data = fgetcsv($uchwyt, 0, " ")) !== false) {
  22. list($kod, $pl, $de, $en, $ru) = $data;
  23.  
  24. $s = $kod;
  25. for($i = 0; $i < 1; $i++) {
  26. $x = preg_replace('/(00)+$/', '', $s);
  27. if(mysql_query("INSERT INTO t_nhm_new(nhm, definition, language, decode_definition) VALUES('".$x."', '".$pl."', '".$plCode."', '".replacePL($pl)."')")
  28. && mysql_query("INSERT INTO t_nhm_new(nhm, definition, language, decode_definition) VALUES('".$x."', '".htmlspecialchars($ru, ENT_QUOTES)."', '".$ruCode."', '".$ru."')")
  29. && mysql_query("INSERT INTO t_nhm_new(nhm, definition, language, decode_definition) VALUES('".$x."', '".$de."', '".$deCode."', '".replaceDE($de)."')")
  30. && mysql_query("INSERT INTO t_nhm_new(nhm, definition, language, decode_definition) VALUES('".$x."', '".wytnij($en)."', '".$enCode."', '".$en."')")) {
  31. } else {
  32. die("<font color='red'>".mysql_error()."</font><br>");
  33. }
  34. }
  35. }



Fragment, który odpowiada za wyświetlenie wyniku:
  1. function ShowNHMs($value, $count) {
  2. echo '<table width="650" align="center" border="0">';
  3. echo '<th width="100" align="center" class="TableHead">Kod NHM</th>'.
  4. '<th width="550" align="center" class="TableHead">Opis</th>'.
  5. '</table>';
  6. echo '<table width="650" align="center" border="0">';
  7. $j = 1;
  8.  
  9. while ($row = mysql_fetch_array($value)) {
  10. $NHMnr = $row[0];
  11. switch(strlen(trim($row[0]))) {
  12. case 2 : $klasaNHM = 'header';
  13. $klasaDef = $klasaNHM;
  14. $poloz = 'left';
  15. break;
  16. case 4 : $klasaNHM = 'tekst12';
  17. $klasaDef = $klasaNHM;
  18. $poloz = 'left';
  19. break;
  20. case 6 : $klasaNHM = 'NHMtekstBold';
  21. $klasaDef = 'tekst11bold';
  22. $poloz = 'center';
  23. $NHMnr = $NHMnr.'&nbsp;';
  24. break;
  25. default: $klasaNHM = 'NHMtekst';
  26. $klasaDef = 'tekstsmall';
  27. $poloz = 'center';
  28. break;
  29. }
  30. if (($j % 2) == 0)
  31. $color = "";
  32. else
  33. $color = ' bgcolor="#D8E6F0"';
  34. echo '<tr>';
  35. echo '<td width="100" align="'.$poloz.'" class="'.$klasaNHM.'"'.$color.'>'.$NHMnr.'</td>'.
  36. '<td width="550" align="left" class="'.$klasaDef.'"'.$color.'>'.$row[1].'</td>';
  37. echo '</tr>';
  38. $j++;
  39. }
  40. echo '</table>';
  41. }


Wszystkie pliki są ustawione na utf8, łącznie z CSV.
cojack
A zobacz w bazie jak Ci przechowuje, może już na samym poziomie bazy się tworzy problem?


@edit
pomysł z irca, masz w head ustawiony charset na utf-8?

@edit 2
kolejny pomysł z irca, może masz źle dobraną czcionkę? arial/tahoma/verdana propozycja.

@edit 3
po ENGINE MYISAM, dodaj DEFAULT CHARSET=utf8, ten pomysł mój.


@EDIT tam na dole

to ja się poddaje.
jakkolwiek
Podglądałem zawartość bazy PhpMyAdminem i MySQL Query Browserem - w obu przypadkach w bazie jest poprawnie zapisana cyrylica.
W każdym pliku mam ustawione w head charset na utf-8, nie licząc pliku zawierającego same funkcje wypisane, który później jest includowany w głównym pliku. Pomysł z czcionką wydał mi się dobry, bo jak się okazało ustawiałem wszędzie Helveticę, ale po zmianie na Ariala lub Verdanę dalej to samo. Dodałem DEFAULT CHARSET=utf8, wyczyściłem bazę załadowałem dane jeszcze raz, wszystko przeładowane i dalej same znaki zapytania. Tylko w przypadku cyrylicy, polskie znaki czy niemieckie umlauty w tej samej tabeli, które się znajdują wyświetlane są bez problemu.
vokiel
A w jakim kodowaniu jest ten plik .csv?

Dane w bazie są poprawne po załadowaniu ich z pliku .csv?

A jakie jest kodowanie samych plików php? Może przekonwertuj pliki php na UTF8 bez BOM za pomocą np notepad++ ?

jakkolwiek
Wszystko jest przekonwertowane na UTF8 właśnie przy pomocy notepad++, dodatkowo dla pewności już jeszcze skorzystałem z gżegżółki na pliku CSV. Świeżo po załadowaniu danych do bazy widzę jest wyświetlone poprawnie w PhpMyAdmin, na stronie nie
vokiel
Masz to gdzieś dostępne z zewnątrz?

Edit:
A i jeszcze jedno, czy dodajesz
  1. SET NAMES utf8;
przed każdym pobraniem danych z bazy, czy tylko przed zapisem?
jakkolwiek
Niestety tylko na lokalu i nie mogę tego udostępnić ze względu na dane firmowe sad.gif
vokiel
To może zrób taki test.
Utwórz nową bazę danych i wypełnij rekordami
  1. SET NAMES utf8;
  2. SET character_set_connection=utf8;
  3. SET character_set_client=utf8;
  4. SET character_set_results=utf8;
  5.  
  6. CREATE TABLE `TEST` (
  7. `ID` int(11) NOT NULL AUTO_INCREMENT,
  8. `PL` varchar(255) DEFAULT NULL,
  9. `DE` varchar(255) DEFAULT NULL,
  10. `RU` varchar(255) DEFAULT NULL,
  11. PRIMARY KEY (`ID`)
  12. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  13.  
  14. INSERT INTO TEST (ID,PL,DE, RU) VALUES (NULL,'Polski','Zusätzlich','Новости');


Odpal notepad++ utwórz nowy plik (UTF8 bez BOM), zrób proste zapytanie z wyświetleniem:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="pl-PL">
  3. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  4. <title>Test</title>
  5. </head>
  6. <body>
  7. <?php
  8. $query = "SELECT * FROM `TEST`;";
  9. $connection = mysql_connect ("localhost", "root", "");
  10. $db = mysql_select_db ('NOWA', $connection);
  11. mysql_query("SET NAMES 'utf8'");
  12. mysql_query('SET character_set_connection=utf8');
  13. mysql_query('SET character_set_client=utf8');
  14. mysql_query('SET character_set_results=utf8');
  15. $result = mysql_query($query);
  16. while($wiersz = mysql_fetch_assoc($result)){
  17. echo '<br />'.$wiersz['ID'].' | '.$wiersz['PL'].' | '.$wiersz['DE'].' | '.$wiersz['RU'];
  18. //ewentualnie
  19. var_dump($wiersz);
  20. }
  21. ?>
  22. </body>
  23. </html>


Zobacz jakie wyniki otrzymasz. Jeśli tutaj będzie ok to znaczy, że musisz przekonwertować pliki (notepad++ doskonale się do tego nadaje, nie trzeba gżegżółki).
jakkolwiek
Dzięki za pomoc! Twój przykład zadziałał i w sumie dużo mi pomógł. Pliki miałem już wcześniej przekonwertowane przy pomocy notepada++, a dopiero później próbowałem jeszcze dla pewności gżegżółką. Co prawda nadal zamiast cyrylicy mam znaki zapytania, ale teraz mam pewność przynajmniej, że błąd nie leży po stronie bazy smile.gif Dzięki! smile.gif

@EDIT:
oczywiście błąd spowodował czynnik ludzki. Wystarczyło dodać:
  1. mysql_query("SET NAMES 'utf8'");
  2. mysql_query('SET character_set_connection=utf8');
  3. mysql_query('SET character_set_client=utf8');
  4. mysql_query('SET character_set_results=utf8');

do połączenia przy pobieraniu danych z bazy. Dodałem to oczywiście w złym miejscu, dodałem przy insercie, ale zapomniałem przy klasie odpowiedzialnej za połączenie przy pobieraniu danych.
Jeszcze raz dziękuję za pomoc zarówno cojack'owi jak i vokiel'owi!
cojack
Tylko ja się zastanawiam, jak to jest możliwe że przy htmlspecialchars dalej miałeś pytajniki. Dla mnie to jest jakiś absurd.No ale ważne że działa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.