Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] cyrylica na stronie
jakkolwiek
post
Post #1





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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ę...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
vokiel
post
Post #2





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
cojack
post
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.
Go to the top of the page
+Quote Post
jakkolwiek
post
Post #4





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
cojack
post
Post #5





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.

Ten post edytował cojack 28.09.2009, 13:51:30
Go to the top of the page
+Quote Post
jakkolwiek
post
Post #6





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
vokiel
post
Post #7





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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++ ?

Go to the top of the page
+Quote Post
jakkolwiek
post
Post #8





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
vokiel
post
Post #9





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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?

Ten post edytował vokiel 28.09.2009, 14:30:44
Go to the top of the page
+Quote Post
jakkolwiek
post
Post #10





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Niestety tylko na lokalu i nie mogę tego udostępnić ze względu na dane firmowe (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
vokiel
post
Post #11





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
jakkolwiek
post
Post #12





Grupa: Zarejestrowani
Postów: 25
Pomógł: 0
Dołączył: 17.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) Dzięki! (IMG:style_emoticons/default/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!

Ten post edytował jakkolwiek 29.09.2009, 09:29:04
Go to the top of the page
+Quote Post
cojack
post
Post #13





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

Ostrzeżenie: (20%)
X----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.12.2025 - 22:17