Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][PHP]Problem z kodowaniem
Forum PHP.pl > Forum > Przedszkole
nitro11
Witam,

Strona ma kodowanie:

  1. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />


Pliki również są zakodowane w latin2 jednak po wejsciu na stronę z przeglądarki, przeglądarku zmienia kodowanie na utf-8 co
powoduje krzaki, jak zmienię w przeglądarce kodowanie na iso-8859-2 to kodowanie jest ok.

Dlaczego przeglądarka zmienia mi kodowanie ?
masiakla
Jaka przeglądarka ?
Jaki jest doctype tego pliku pewnie jakiś xhtml ?
Jak definiujesz całość ?
nitro11
Przeglądarka: FF, OPERA, IE

To popularny skrypt TSI-G

Nagłówek:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2.  
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  4.  
  5.  
  6. <meta name="Description" content="" />
  7. <meta name="Keywords" content="" />
  8. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  9. <meta name="Distribution" content="Global" />
  10. <meta name="Robots" content="index,follow" />
  11. <meta name="copyright" content="2006-2008 TSI-G" />
  12.  
  13.  
  14. <link rel="stylesheet" href="theme/serial/style.css" type="text/css" />
  15.  
  16. <script type="text/javascript" src="js/advajax.js"></script>
  17. <script type="text/javascript" src="js/rating.js"></script>
  18.  
  19. <title>Title</title>
  20.  
  21. </head>



Na serwerze na home. gdzie mam inne ustawienie kodowania w bazie wszystko jest ok, ale na dedyku
z innymi ustawieniami niż na home jest problem z kodowaniem.

Próbowałem setki razy zmieniać rożne parametry, ale bez rezultatu.

Mimo wszystko (chociaż próbowałem różnych ustawień, różnica jest tylko taka, że u mnie jest System kodowania znaków dla MySQL: UTF-8 Unicode (utf8) a na home latin-2) kodowanie w bazie chyba nie powinno zmieniać kodowania które jest ustawione w:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
a zarazem kodowania które ustawia przeglądarka ?

Ach te głupie polskie ogonki.

Czasem kilka dni trzeba kombinować co i jak a 'anglicy' mają z górki winksmiley.jpg
masiakla
Nie miewam z goła takiego problemu bo sam używam głównie utf-8, ale kiedyś miałem coś podobnego i było to z powodowane tym, że w nagłówkach odpowiedzi było podane kodowanie, które brały sobie przeglądarki, a meta olewały wprost, może i to jest tutaj problemem. Kurd enie pamiętam jak to rozwiązałem, ale coś w configu serwera chyba zmieniałem ....
everth
Cała stronka o kodowaniu w PHPie, HTML i Bóg raczy wiedzieć w czym jeszcze. Może ci pomoże. Obstawiam headery albo mimo wszystko bazę.
nitro11
Próbowałem zmieniać nawet kodowanie stron na utf i plików, ale nici...

Jeśli ktoś może mi powiedzieć, czy problem z kodowaniem w bazie może mieć wpływ na to, że w przeglądarkach ustawia się domyślne kodowanie
inne niż to ustawione w META byłbym bardzo wdzięczny bo nie wiem czy mam walczyć dalej z bazą, czy z czymś innym.

A może w jakiś inny sposób można wymusić kodowanie w bazie ?
masiakla
Po krótkim sprawdzeniu na serwerze mam to zrobione poprzez dodanie do configu http://httpd.apache.org/docs/2.0/mod/core....ddefaultcharset, można to tez zrobić w htaccess, jak nie masz zablokowanej możliwości zmiany tego, po więcej odsyłam do dokumentacji.

Drugi sposób, jak dla mnie trochę brutalny, ale tez może zadziałać to ręczna zmiana nagłówka Content-type wysyłanego przez serwer:
  1. header("Content-Type: text/html; charset=ISO-8859-2");


Egh niedoczytałem drugiego posta:
Cytat(nitro11)
Mimo wszystko (chociaż próbowałem różnych ustawień, różnica jest tylko taka, że u mnie jest System kodowania znaków dla MySQL: UTF-8 Unicode (utf8) a na home latin-2) kodowanie w bazie chyba nie powinno zmieniać kodowania które jest ustawione

Tak może, chodzi o to, nawet nie musi tego robić sama baza, zdarzą się też tak, że wystarczy by klient mysql miał inne kodowanie to wszystko będzie się chrzanić. Unicode polskie znaki np. zapisuje praktycznie jako dwa znaki i z tąd może być ten problem.
nitro11
Czyli mam dopisać do konfiguracji msql w pliku msql.coś tam ; linijkę:
AddDefaultCharset utf-8

lub

AddDefaultCharset iso-8859-2

albo dodać
header("Content-Type: text/html; charset=ISO-8859-2");
w index.php ?

Masiakla, przeczytałem też Twojego najnowszego posta (też by mi umknął)
i skoro mówisz, że to jednak baza a skoro na home (inna konf. bazy) wszystko działało
to chyba nie ma co kombinować innego tylko robić coś bazą, ale co ?

Normalnie nie chce mi sie juz przerabic 100 plikow przez iconv bo moze zadziala sad.gif




BTW: A jak na linuxie zmienić ustawienie MySQL:
System kodowania znaków dla MySQL: UTF-8 Unicode (utf8)
(zmienić na inne kodowanie, latin2)

Z MyAdmina tego nie zrobię, ale w konf. mysql musi się jakoś dac.
masiakla
Adddefaultcharset to jest do konfiguracji Apache'a, w mysql można załatwić to inaczej ... sekundkę muszę znowu wleźć na serwer bo nie pamiętam.

BTW nagłówków, zobacz za pomocą livehttpheader czy innego dodatku do ff czy rzeczywiście dostajesz inny.

Przykładowe wpisy ze starego configa odnośnie kodowania w pliku my.cnf(jakbyś miał problem z wyszukaniem to możesz użyć locate my.cnf lub whereis my.cnf, powinno być w etc lub ciutkę głębiej na Fedorze było /etc/my.cnf, na Debianie mam w /etc/mysql/my.cnf).
Kod
[mysql]
character-sets-dir=utf8
default-character-set=utf8

[mysqladmin]
character-sets-dir=utf8
default-character-set=utf8

[mysqlcheck]
character-sets-dir=utf8
default-character-set=utf8

[mysqldump]
character-sets-dir=utf8
default-character-set=utf8

[mysqlimport]
character-sets-dir=utf8
default-character-set=utf8

[mysqlshow]
character-sets-dir=utf8
default-character-set=utf8

[myisamchk]
character-sets-dir=utf8

[myisampack]
character-sets-dir=utf8

[mysqld]
character-set-server = utf8
default-character-set = utf8

Tylko teraz pozostaje kwestia jak masz to w bazie .... Kodowanie oczywiście zmieniasz na swoje powyższe to tylko przykład.
everth
hmm, mam rozumieć że regułka "set names MOJE_KODOWANIE" już była sprawdzana? np. dla PDO
  1. $pdo->query("SET NAMES 'utf8'");
nitro11
Oczywiście SET NAMES bylo sprawdzane, ale nie działa.

Live Headers rzeczywiście zwraca:
Content-Type: text/html; charset=UTF-8

A nie latin2!



Dziwna sprawa,

plik w etc/mysql/my.cnf zajmuje 126 bajtow i jest tam 5 linijek exclamation.gif
(kiedys cos kombinowalem, ale przywrocilem pierwotna wersje)

Mam tam też plik my.cnf.off ktory zawiera cala konf.

O co chodzi znowu ?

W każdym razie przywrócenie oryginalnego pliku (ten z .off)
nic nie zmieniło :/
masiakla
Takie pytanie jakie masz zainstalowane distro ? Może to off to pozostałość po jakimś update, ja tez mam kupę plików w stylu /etc/mysql/my.cnf.dpkg-old, ale nvm. Co do nagłówka to wstaw go w miejscu w którym wiesz na pewno, że jeszcze nic nie było wysłane do przeglądarki, bo w innym przypadku możesz zobaczyć miły błąd. my.cnf chyba nie potrzebuje być jakiś olbrzymi, do końca nie wiem, aż tak nie wnikałem w konfigurację mysql, miałem jeszcze problem tylko z gigantycznymi plikami przy tabelach innodb, ale to tez prosto się rozwiązuje.

Po zmianie pliku restartowałeś serwer mysql, bo bez tego raczej nie zauważył nawet zmiany konfiguracji.
everth
Najprostsze obejście - olej kodowanie ISO i wystawiaj w UTF8. Przeleć to co dostajesz na wyjściu bufora za mb_convert_encoding()
  1. echo mb_convert_encoding(ob_flush(),'UTF-8');

Drugie obejście
  1. header("Content-Type: text/html; charset=iso-8859-2");
  2. echo mb_convert_encoding(ob_flush(),'ISO-8859-2');
nitro11
Oczywiście restartowałem mysqla smile.gif

Chłopaki naprawdę wielkie dzięki za zaangażowanie, nie spodziewałem się :]
Trochę mi zajmie sprawdzenie waszych najnowszych porad bo już późna godzina
i ledwo patrze na oczy przez to wszystko.

W każdym razie my.cnf zamieniłem na konf. którą podaliście, ale też nie zadziałało, bez zmian aarghhh....

Te ostatnie pomysly są ciekawe, może pomogą w wykryciu problemu.


Cytat(everth @ 6.09.2010, 01:29:47 ) *
Najprostsze obejście - olej kodowanie ISO i wystawiaj w UTF8. Przeleć to co dostajesz na wyjściu bufora za mb_convert_encoding()
  1. echo mb_convert_encoding(ob_flush(),'UTF-8');

Ale gdzie to wstawić w index.php po hederze (z latin2) ?
Przypominam, że strona ma kodowanie latin2 a nie utf-8 i w tym kodowaniu (wybranym z przeglądarki wszystko smiga)


MASIAKLA // Jestem początkujący i nie mam pojęcia czym jest DISTRO ale poszukam w miedzy czasie ...
masiakla
mam na myśli dystrybucję linuxa. Bo największe problemy miałem z Fedorą, między innymi z tym kodowaniem w nagłówku. Jak jesteś poczatku to pewnie nie dołączasz żadnych zewnętrznych repozytoriów, więc pomogłoby to okreslić na jakich wersjach softu pracujesz.
everth
@nitro - wstaw to na końcu index.php - czyli tak:
  1. <?php
  2. // cała mechanika twojej strony
  3.  
  4. // header("Content-Type: text/html; charset=iso-8859-2"); // - tutaj opcjonalny header jak chcesz drugim sposobem
  5. echo mb_convert_encoding(ob_flush(),'UTF-8');
  6. ?>

Jeśli gdzieś odwołujesz nie poprzez index.php tylko jakiś inny plik to tam też musisz zrobić to samo. Mb_convert_encoding() jest po to żeby przekodować strumień wyjściowy i puścić go we właściwym kodowaniu - tak jest w teorii. Czy w praktyce ci zadziała to już musisz sprawdzić sam.
motyl-pl
  1. mysql_query("SET SESSION character_set_results = 'latin2'");


Mi to zawsze pomagało tongue.gif
nitro11
Cytat(motyl-pl @ 6.09.2010, 02:10:25 ) *
  1. mysql_query("SET SESSION character_set_results = 'latin2'");


Mi to zawsze pomagało tongue.gif


Bez zmian...

Zmieniłem index.php na:

<
  1. ?
  2.  
  3.  
  4.  
  5. include("subheader.php");
  6. include("left.php");
  7.  
  8. bodyc();
  9. echo"<br>";
  10. if($u_wo == 1)
  11. {
  12.  
  13. menuf();
  14. echo''.$u_witam.'';
  15. menufe();
  16.  
  17. }
  18.  
  19. if($u_news_on == 1)
  20. {
  21. if($u_news_wen == 0)
  22. {
  23. include('include/news.php');
  24. }
  25. }
  26.  
  27. $link="index,";
  28.  
  29. $zapytanie = "SELECT * FROM movie WHERE active='1' ORDER by id DESC";
  30.  
  31. if(!$strona){
  32. $nr=$_GET["strona"];
  33. if($nr==0)
  34. {
  35. $nr=1;
  36. }
  37.  
  38. $strona=$nr;
  39. }
  40.  
  41.  
  42. $ile=$u_ile_w;
  43.  
  44. $start=($strona-1)*$ile;
  45.  
  46. $wykonaj = mysql_query($zapytanie) or Die("Nie działa zapytanie". $zapytanie);
  47. $ile_rek = mysql_num_rows($wykonaj);
  48.  
  49. $podstron = ceil($ile_rek/$ile);
  50.  
  51. $zapytanie.= " LIMIT $start,$ile";
  52.  
  53. $final = mysql_query($zapytanie) or Die ("Nie działa zapytanie końcowe");
  54. $i=0;
  55.  
  56. if($ile_rek>$ile)
  57. {
  58. include("podzial.php");
  59. }
  60.  
  61. while($row=mysql_fetch_array($final))
  62. {
  63.  
  64. $ress = mysql_query("SELECT id FROM komentarze WHERE movie='".$row['id']."'");
  65. $ilee = mysql_num_rows($ress);
  66.  
  67. menuf();
  68. if($i%2 == 0)
  69. {
  70. $bgc = 'class="color1"';
  71. }
  72. else
  73. {
  74. $bgc = 'class="color2"';
  75. }
  76. $i++;
  77.  
  78.  
  79. $Query='SELECT * FROM cats WHERE id='.$row['cat'].'';
  80. $result = mysql_query($Query) or die (mysql_error());
  81. while ( $roww = mysql_fetch_array($result))
  82. {
  83. $catn = $roww['name'];
  84. }
  85.  
  86. $info_movie = get_template('info_movie.tpl');
  87.  
  88. $info_movie = str_replace("{background}", $bgc, $info_movie);
  89. $info_movie = str_replace("{kategoria}", $catn, $info_movie);
  90. $info_movie = str_replace("{tytul}", $row['tytul'], $info_movie);
  91. $info_movie = str_replace("{opis}", $row['opis'], $info_movie);
  92. $info_movie = str_replace("{zasugerowal_l}", $l_v_zas, $info_movie);
  93. $info_movie = str_replace("{dodal}", $row['dodal'], $info_movie);
  94. $info_movie = str_replace("{ocena_l}", $l_v_ocena, $info_movie);
  95. $info_movie = str_replace("{ocena}", $row['ocena'], $info_movie);
  96. $info_movie = str_replace("{glosy_l}", $l_v_glosow, $info_movie);
  97. $info_movie = str_replace("{glosy}", $row['ile'], $info_movie);
  98. $info_movie = str_replace("{view_l}", $l_v_view, $info_movie);
  99. $info_movie = str_replace("{view}", $row['view'], $info_movie);
  100. $info_movie = str_replace("{komentarze_l}", $l_v_kom, $info_movie);
  101. $info_movie = str_replace("{komentarze}", $ilee, $info_movie);
  102. $info_movie = str_replace("{tytul_n}", namen($row['tytul']), $info_movie);
  103. $info_movie = str_replace("{id}", $row['id'], $info_movie);
  104. $info_movie = str_replace("{tytul}", $row['tytul'], $info_movie);
  105. $info_movie = str_replace("{img}", $row['img'], $info_movie);
  106.  
  107. echo $info_movie;
  108.  
  109. menufe();
  110. }
  111.  
  112. if($ile_rek>$ile)
  113. {
  114. include("podzial.php");
  115. }
  116.  
  117. if($u_news_on == 1)
  118. {
  119. if($u_news_wen == 1)
  120. {
  121. include('include/news.php');
  122. }
  123. }
  124.  
  125. bodyc();
  126.  
  127. include("right.php");
  128.  
  129. include("footer.php");
  130.  
  131. echo mb_convert_encoding(ob_flush(),'UTF-8');
  132.  
  133. ?>



I nic ..................
everth
Wypróbuj ten drugi sposób (z headerem i konwersją ustawioną na iso-8859-2). Pamiętaj że kodowanie w header i meta powinno się zgadzać. Dzisiaj już raczej nic bardziej konstruktywnego nie wymyślę.
motyl-pl
Cytat(motyl-pl @ 6.09.2010, 02:10:25 ) *
  1. mysql_query("SET SESSION character_set_results = 'latin2'");


Mi to zawsze pomagało tongue.gif


A dałeś jako utf8 czy zostawiłeś latin2 ?
nitro11
Pomogło wstawienie na początku:
header("Content-Type: text/html; charset=iso-8859-2");

'Miliony' innych sposobów zawiodły i sporo godzin straciłem na szukanie rozwiązania, a okazuje się, że było takie proste smile.gif

Dziękuję wszystkim za pomoc!
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.