Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dziwne kodowanie polskich znaków, MySQL
rugby
post
Post #1





Grupa: Zarejestrowani
Postów: 61
Pomógł: 1
Dołączył: 21.05.2009

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


Zauważyłem, że w mojej bazie danych MySQL polskie znaki zachowywane są w dziwny sposób:

Kod
"Ä…"=>"ą"
"ć"=>"ć"
"Ä™"=>"ę"
"ó"=>"ó"
"Å‚"=>"ł"
"Å„"=>"ń"
"Å›"=>"ś"
"ż"=>"ż"
"ź"=>"ź"
"Å�"=>"Ł"
"Ó"=>"Ó"
"ü"=>"ü"
"ä"=>"ä"
"Å‘"=>"ö"
"Å�"=>"Ö"

Strona, która na moim serwerze wyświetla dane z bazy ma kodowanie UTF-8 i wyświetla znaki poprawnie. Kiedy zrobię zrzut bazy i zaimportuję go na inny serwer przez phpMyAdmin, to polskie znaki mają postać niepoprawną mimo takiej samej strony wyświetlającej je.

Jakim programem skonwertować te niepoprawne znaki na ich odpowiedniki w UTF-8?
Go to the top of the page
+Quote Post
leon1313
post
Post #2





Grupa: Zarejestrowani
Postów: 20
Pomógł: 0
Dołączył: 23.10.2007

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


A próbowałeś
Kod
  "SET NAMES 'utf8'"
Go to the top of the page
+Quote Post
blooregard
post
Post #3


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Przy imporcie przez phpMA ustaw właściwy zestaw znaków dla importowanej bazy, może to jest przyczyną ("Kodowanie pliku")
Go to the top of the page
+Quote Post
rugby
post
Post #4





Grupa: Zarejestrowani
Postów: 61
Pomógł: 1
Dołączył: 21.05.2009

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


Sęk w tym, że w UTF-8 jest cały phpMyAdmin, importowanie plików jako UTF-8, jak na mojej stronie (też z kodowaniem UTF-8) dam "set names utf8" to wyświetla właśnie takie krzaczki jak powyżej, a jak nie dam to wyświetla znaki zapytania zamiast polskich znaków w Firefoxie.

Mam wrażenie, że te polskie znaki zapisane są w jakiejś odmianie Unicode, gdyż 1 znak zajmuje 2 bajty (tak jak przy UTF-8).
Go to the top of the page
+Quote Post
erix
post
Post #5





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
są w jakiejś odmianie Unicode, gdyż 1 znak zajmuje 2 bajty (tak jak przy UTF-8).

Gdyby był unicode, to wszystki znaki by tyle zajmowały. UTF zapisuje dwubajtowo znaki wykraczające poza zakres ASCII.

Cytat
jak na mojej stronie (też z kodowaniem UTF-8) dam "set names utf8" to wyświetla właśnie takie krzaczki jak powyżej, a jak nie dam to wyświetla znaki zapytania zamiast polskich znaków w Firefoxie.

Dopisz to samo zapytanie do pliku, który importujesz. (na początku (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) )
Go to the top of the page
+Quote Post
rugby
post
Post #6





Grupa: Zarejestrowani
Postów: 61
Pomógł: 1
Dołączył: 21.05.2009

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


Cytat(erix @ 2.06.2009, 10:47:40 ) *
Gdyby był unicode, to wszystki znaki by tyle zajmowały. UTF zapisuje dwubajtowo znaki wykraczające poza zakres ASCII.
Unicode to tylko zestaw znaków, a UTF-8 to właśnie jeden z systemów ich kodowania.
Cytat(erix @ 2.06.2009, 10:47:40 ) *
Dopisz to samo zapytanie do pliku, który importujesz. (na początku (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) )
Dopisałem, dalej mam krzaczki zamiast polskich liter.

Natomiast znalazłem ten ciekawy post, przydałoby się takie bbWP2UTF8 dla dowolnych plików SQL, bo ręcznie mi się wszystkich polskich znaków nie uśmiecha zamieniać.
Go to the top of the page
+Quote Post
Roly
post
Post #7





Grupa: Zarejestrowani
Postów: 55
Pomógł: 7
Dołączył: 8.12.2003
Skąd: Andrychów

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


Zawsze mnie dziwią te problemy z kodowanie znaków w bazach danych a już szczególnie wówczas jak dane mamy wszędzie w utf-8. Przecież recepta na to jest prosta:
- zwracaj uwagę na kodowanie znaków przy połączeniu (w phpMyAdmin zaraz po zalogowaniu masz info z jakiego rodzaju kodowania korzystasz, w aplikacji wystarczy zapytanie)

  1. SET NAMES 'utf8';


lub

  1. <?php
  2. mysql_set_charset('utf8');
  3. ?>

- jeżeli tworzysz tabelki ustawiaj im kodowanie na utf8
- jeżeli tworzysz kolumny ustawiaj im również kodowanie na utf8
- nie otwieraj zrzutów bazy danych notatnikiem tylko jakimś innym edytorem potrafiącym sprawdzić sobie kodowanie pliku tekstowego
- uważaj na edytory bo niektóre wstawiają do utf8 znacznik kolejności bajtów (BOM) który w UTF-8 jest nieobowiązkowy

PS
Jeżeli masz już zrypany zrzut bazy (czytaj krzaki w pliku) to poszukaj programu Gżegżółka (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

PS 2
Dla pewności wstawi jeszcze na początku pliku w którym wysyłasz dane do przeglądarki

  1. <?php
  2. header('Content-Type: text/html; charset=utf-8');
  3. ?>


Zmień oczywiście typ zwracanego dokumentu jeżeli jest nie poprawny (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
No i jeszcze dla pewności w IE

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


Ten post edytował Roly 3.06.2009, 13:40:10
Go to the top of the page
+Quote Post
rugby
post
Post #8





Grupa: Zarejestrowani
Postów: 61
Pomógł: 1
Dołączył: 21.05.2009

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


Przecież już pisałem, że wszędzie mam UTF-8, zarówno w HTML-u jak i w połączeniu z bazą (SET NAMES utf8). Natomiast dane w pliku eksportu są zapisane takimi krzaczkami. Próbowałem już Gżegżółką, ale tam jest tylko ISO<->UTF8 i WIN1250<->UTF8, a ja potrzebuję coś jak DZIWNY_UTF8<->UTF8.

Nie mogąc się doczekać odpowiedzi zrobiłem prosty skrypt w PHP:
  1. <?php
  2. if($_POST['text'])
  3. {
  4.    header("Content-type: text/plain; charset=utf-8");
  5.    header("Content-disposition: attachment; filename=dump.sql");
  6.    $msg=$_POST['text'];
  7.    $msg=str_replace("Ä…","ą",$msg);
  8.    $msg=str_replace("ć","ć",$msg);
  9.    $msg=str_replace("Ä™","ę",$msg);
  10.    $msg=str_replace("Ăł","ó",$msg);
  11.    $msg=str_replace("Ĺ‚","ł",$msg);
  12.    $msg=str_replace("Ĺ„","ń",$msg);
  13.    $msg=str_replace("Ĺ›","ś",$msg);
  14.    $msg=str_replace("Ĺź","ż",$msg);
  15.    $msg=str_replace("Ĺş","ź",$msg);
  16.    $msg=str_replace("Ł","Ł",$msg);
  17.    $msg=str_replace("Ă“","Ó",$msg);
  18.    $msg=str_replace("Ăź","ü",$msg);
  19.    $msg=str_replace("ä","ä",$msg);
  20.    $msg=str_replace("Ĺ‘","ö",$msg);
  21.    $msg=str_replace("Ő","Ö",$msg);
  22.    echo stripslashes($msg);
  23. }
  24. ?>
Go to the top of the page
+Quote Post
Largo
post
Post #9





Grupa: Zarejestrowani
Postów: 203
Pomógł: 6
Dołączył: 11.09.2005

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


Witam,

Mam dokładnie taki sam problem, czy to wina baz danych?
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: 23.08.2025 - 23:28