Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dziwne kodowanie polskich znaków
Forum PHP.pl > Forum > Bazy danych
rugby
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?
leon1313
A próbowałeś
Kod
  "SET NAMES 'utf8'"
blooregard
Przy imporcie przez phpMA ustaw właściwy zestaw znaków dla importowanej bazy, może to jest przyczyną ("Kodowanie pliku")
rugby
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).
erix
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 winksmiley.jpg)
rugby
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 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ć.
Roly
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 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 smile.gif
No i jeszcze dla pewności w IE

  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
rugby
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. ?>
Largo
Witam,

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