latin1
Kodowanie ISO/IEC 8859-1 znane pod nazwami takimi jak zachodnioeuropejskie Latin-1 latin1 oraz ISO-8859-1, obojętnie jakiej nazwy użyjemy zawsze chodzi o to samo kodowanie. Ważna zasada, której się trzymajmy i którą wyjaśnię:
kodowanie latin1, ISO-8859-1 nie obsługuje polskich znaków ani nie istnieją one w tym kodowaniu
Polskie znaki jednak jakimś cudem działają, bardzo prosto da się to wyjaśnić: w tym kodowaniu nie ma polskich znaków, ani polskie znaki w nim nie istnieją. Ale jednak jakimś cudem działają… Otóż działają dzięki temu, że wszystkie kodowania z rodziny ISO-8859 są ze sobą zgodne Konwersja z CP-1250 na utf8 – Convert from CP-1250 to utf8.
Bardziej łopatologicznie, mamy stronę w kodowaniu ISO-8859-2 (to kodowanie obsługuje polskie znaki) więc wysyłamy przykładowo ciąg polskich znaków: ą,ć,ę,ł,ń,ó,ś,ź,ż,Ą,Ć,Ę,Ł,Ń,Ó,Ś,Ź,Ż lecz należy pamiętać iż nasz serwer mysql, baza danych oraz tabele jak i kolumny korzystają z kodowania latin1 (najczęściej z porównaniem znaków ustawionym na latin1_swedish_ci) więc powyższy ciąg zostanie zastąpiony krzakami ±,æ,ê,³,ñ,ó,¶,¼,¿,¡,Æ,Ê,£,Ñ,Ó,¦,¬,¯, i niestety po zapisie w bazie mamy krzaczki zamiast polskich znaków Konwersja z ISO-8859-1 na UTF-8 – Convert from ISO-8859-1 to UTF-8.
Lecz należy pamiętać, iż jest o wiele więcej znaków specjalnych, które są zamieniane na krzaczki nie mające nic wspólnego z oryginalnymi znakami.
Ten problem z kodowaniem dotyczy głównie baz mysql, jeśli nie tylko baz. Dlatego zrobiłem konwerter, który przywraca polskie znaki w kopiach baz danych zapisanych za pomocą phpMyAdmin (ponieważ phpMyAdmin zapisuje wszystkie kopie baz danych w kodowaniu UTF-8).
Jeśli kopia została wykonana za pomocą phpMyAdmin lub innego skryptu który koduje kopie baz w UTF-8, a sama baza danych pracuje w kodowaniu latin1 to zrobiłem konwerter Konwersja z latin1 na latin2 – Convert from latin1 to latin2, zamienia krzaczki z takiej kopii na polskie znaki w kodowaniu ISO-8859-2 (przy imporcie takiego pliku należy wybrać z listy latin2) oraz Konwersja z latin1 na utf8 – Convert from latin1 to utf8 który zamienia znów krzaczki w kopii na polskie znaki, tym razem w kodowaniu UTF-8 (przy imporcie wybieramy utf8 z listy).
Należy także pamiętać by w pliku z kopią bazy danych po konwersji z latin1 na latin2 w pliku z kopią zmodyfikować linijki:
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; |
na:
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES latin2 */; |
Przy konwersji z latin1 na utf8 ten zabieg jest zbędny! Przy imporcie za pomocą linii komend także należy podać właściwe kodowanie.
W skrócie, jeśli polskim znakom w twojej kopi bazy odpowiadają krzaczki takie jak w tabelce niżej, to po eksporcie, ten konwerter naprawi twoja bazę. (jeśli miałeś kodowanie latin1) Konwersja z Windows-1250 na ISO-8859-2 – Convert from Windows-1250 to ISO-8859-2
HEX | latin2 | latin1 |
b1 | ą | ± |
e6 | ć | æ |
ea | ę | ê |
b3 | ł | ³ |
f1 | ń | ñ |
f3 | ó | ó |
b6 | ś | ¶ |
bc | ź | ¼ |
bf | ż | ¿ |
a1 | Ą | ¡ |
c6 | Ć | Æ |
ca | Ę | Ê |
a3 | Ł | £ |
d1 | Ń | Ñ |
d3 | Ó | Ó |
a6 | Ś | ¦ |
ac | Ź | ¬ |
af | Ż | ¯ |
Oraz wywołanie zapytania:
SHOW VARIABLES LIKE 'character_set%'; |
powoduje wyświetlenie wyników podobnych do tych:
character set client | latin1 |
character_set_connection | latin1 |
character set database | latin1 |
character_set_results | latin1 |
character_set_server | latin1 |
character_set_system | latin1 |
jak i tego:
SHOW VARIABLES LIKE 'collation%'; |
do tych:
collation_connection | latin1_swedish_ci |
collation_database | latin1_swedish_ci |
collation_server | latin1_swedish_ci |
Oznacza to że w bazie masz kraczki, zamiast właściwych znaków. Należy także pamiętać o ustawieniu właściwego kodowania dla tabel, bazy jak i połączenia z mysql, opisałem to ISO-8859-1 latin1 ISO-8859-2 latin2 Windows-1250 cp-1250 UTF-8 utf8 i jest tam zawarte jak wgrać bazę by przyjęła kodowanie ustawione wcześniej jak i ustawienie kodowania dla połączenia z mysql.
Pragnę przypomnieć, że konwerter kodowania obsługuje całe 167 znaków z kodowania iso-8859-2 zapisane w krzakach z latin1 a nie tylko polskie znaki!
Najnowsze komentarze