Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Problem z kodowaniem po reinstalacji serwera
Forum PHP.pl > Forum > Przedszkole
Kshyhoo
Przeinstalowałem serwer i się zaczęło. Mam kilka problemów, z którymi nie mogę sobie poradzić, więc proszę o radę.
mam tak:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

połączenie z bazą:
  1. mysql_connect($db_host, $db_user, $db_pass)
  2. or die('Wystapił błąd połączenia z serwerem MySQL');
  3.  
  4. mysql_select_db($db_name)
  5. or die('Wystąpił błąd połączenia z bazą danych');
  6.  
  7. mysql_query("SET NAMES `utf8` COLLATE `utf8_polish_ci`");

baza: utf8_general_ci
tabela: utf8_polish_ci
pole: tresc longtext utf8_polish_ci
I puszcza mi tylko jak myślę, 256 znaków. Pewnie coś w konfiguracji MySQL?
nospor
nie: mysql_query("SET NAMES `utf8` COLLATE `utf8_polish_ci`");
a: mysql_query("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");
Odróżniaj tekst od nazw kolumn/tabel

Cytat
I puszcza mi tylko jak myślę, 256 znaków
Czyli co mianowicie? Opisz problem dokładniej, pokaz kod. Ksyhoo raportowałeś wcale nie gorsze tematy od tych, co ostatnio sam zadajesz.
Kshyhoo
Już sobie poradziłem z tą ilością a ciapki miałem dobrze - nie wiem, czemu tak mi skopiowało.
Ale problem mam teraz nieco inny. Mianowicie, pobieram:
  1. $res = mysql_fetch_row(mysql_query('SELECT id, word FROM '.$dtable.' WHERE id='.$posizione_parola));

i mam:
Cytat
string(4) "ĆMA"

a to przecież 3 znaki.
Jak dam:
  1. $parola[1] = utf8_decode($parola[1]);

to daje:
Cytat
string(3) "?MA"

A w bazie mam ĆMA...
nospor
Nie, ĆMA to w utf-8 4 znaki. Ć to dwa znaki.

wróć, nie znaki a bajty. smile.gif

utf8_decode - po co to używasz, skoro dane masz poprawne? przecież to bez sensu
Kshyhoo
To jak mam to pobrać, żebym miał 3 znaki?
nospor
Ale o co ci chodzi? Co ty chcesz z tym zrobić?

Polskie krzaki w utf-8 zajmują dwa bajty - proste. W czym ci to przeszkadza? O co ci chodzi?

Jak chcesz pobrać liczbę znaków uwzględniając polskie krzaki, to masz użyć:
http://www.php.net/manual/en/function.mb-strlen.php
Kshyhoo
Chcę zrobić tak:
1. pobieram słowo (ĆMA).
2. zamieniam słowo na podkreślniki (___).
3. dodaje między nimi spacje (_ _ _)
4. wyświetlam...
nospor
No to biblioteka MB. Link dostałeś w poprzednim poście
Kshyhoo
Czyli:
  1. $parola[1] = utf8_decode($parola[1]);

zwraca:
Cytat
string(3) "?MA"

a:
  1. $parola[1] = mb_strlen($parola[1]);

zwraca:
Cytat
int(3)
nospor
Przecież mb_strlen() zwraca liczbę, która określa liczbę znaków.....
Kshyhoo
No tak, a ja potrzebuję stringa, szukam dalej.
nospor
Ksyhoo obudź się człowieku wkońcu.....
Chcesz dla słowa 3 znakowego zrobić ___ no to mając liczbę znaków bez problemu możesz wygenerować ___ O pętli FOR nie słyszał?

A jak chcesz mieć słowo ĆMA, ktore składa się dokładnie z 3 bajtów, to zmień kodowanie z UTF-8 na ISO-8859-2.
Metoda ICONV()
Kshyhoo
To robię, na dodatek podmieniam na grafiki. Wszystko mi działa, dopóki nie pojawi się polski znak.
nospor
To pokaż kod. Tylko proszę, niech ten kod zawiera już mb_strlen lub iconv, skoro piszesz, że tak właśnie robisz jak ci napisałem
Kshyhoo
Pobieram słowo z bazy danych:
  1. function ScegliParola ($user, $pword, $dhost, $dbase, $dtable)
  2. {
  3. $res = mysql_fetch_row(mysql_query('SELECT max(id) FROM '.$dtable));
  4. $numero_parole = $res;
  5. $posizione_parola = rand (2, $numero_parole[0]);
  6. $res = mysql_fetch_row(mysql_query('SELECT id, word FROM '.$dtable.' WHERE id='.$posizione_parola));
  7. $parola = $res;
  8. //$parola[1] = utf8_decode($parola[1]); // string(3) "?MA"
  9. //$parola[1] = mb_strlen($parola[1], 'utf8'); // int(3)
  10. return ($parola);
  11. }

nospor
No i gdzie tu zamieniasz słowo na ___ ? No napisałeś że z tym masz problem, gdy masz polski znak. I napisałeś, ze pomimo używania mb_strlen lub iconv nadal masz problem. No i ja się pytam o ten właśnie kod.
Kshyhoo
Cały skrypt mi działa, jedynie funkcje php nie przetwarzają poprawnie polskich znaków - to problem. Już funkcja:
  1. var_dump(ScegliParola ($user, $pword, $dhost, $dbase, $dtable));

zwraca dla słowa ŻÓŁĆ:
Cytat
array(2) { [0]=> string(2) "100" [1]=> string(8) "????" } Array
nospor
Dobra. Ja już nie mam sił....

ps: nie sądziłem, że kiedykolwiek napiszę tak do Ciebie sad.gif
Kshyhoo
Tak wyświetlam wybrane litery
  1. //$scelt = mb_split('//', $scelte, -1);
  2. $scelt = preg_split('//', $scelte, -1, PREG_SPLIT_NO_EMPTY);
  3. print_r($scelt);
  4. echo ("\n<p>\n");
  5. foreach ($alfabeto as $lettalf) {
  6. $contrl = false;
  7. foreach ($scelt as $lett) {
  8. if (!strcasecmp($lettalf, $lett)) {
  9. $contrl = true;
  10. }
  11. }
  12. if ($contrl) {
  13. print (' <img src="images/lr_'.$lettalf.'.png" style="border: 0; width: 20px; height: 20px" alt="'.$lettalf.'" />');
  14. } else {
  15. print (' <a href="'.$_SERVER['PHP_SELF'].'?letter='.$lettalf.'"><img src="images/lb_'.$lettalf.'.png" style="border: 0; width: 20px; height: 20px" alt="'.$lettalf.'" /></a>');
  16. }
  17. /* if ($lettalf=='i') echo ("\n <br />");
  18. echo ("\n");
  19. if ($lettalf=='r') echo ("\n <br />");
  20. echo ("\n"); */
  21. }
  22. echo ("</p>\n"); echo $scelte;

tak alfabet:
  1. print ('<p><img src="images/hang_'.($tentativi+1).'.png" style="border:0;width:150px;height:200px" alt="Miss '.$tentativi.'/6" /></p>');
  2. echo ("\n<p>\n");
  3. $caratteri = preg_split('//', $indovinata, -1, PREG_SPLIT_NO_EMPTY);
  4. foreach ($caratteri as $lettalf) {
  5. $lettalf = strtr($lettalf, $alfabeto);
  6. if ($lettalf==' ') {
  7. print (' <img src="images/lb_~.png" style="border: 0; width: 20px; height: 20px" alt="" />');
  8. } else {
  9. print (' <img src="images/lb_'.$lettalf.'.png" style="border: 0; width: 20px; height: 20px" alt="'.$lettalf.'" />');
  10. }
  11. echo ("\n");
  12. print (' <img src="images/lb_~.png" style="border: 0; width: 20px; height: 20px" alt="" />');
  13. echo ("\n");
  14. }
  15. print ('</p>');
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.