O co chodzi z latin1 i dlaczego działają w nim polskie znaki

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

HEXlatin2latin1
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 clientlatin1
character_set_connectionlatin1
character set databaselatin1
character_set_resultslatin1
character_set_serverlatin1
character_set_systemlatin1

jak i tego:

SHOW VARIABLES LIKE 'collation%';

do tych:

collation_connectionlatin1_swedish_ci
collation_databaselatin1_swedish_ci
collation_serverlatin1_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!

1 Comment

  1. Dzięki wielkie ten artykuł bardzo mi pomógł jak i sam konwerter !

Dodaj komentarz