-->

Zamiana polskich znaków w najpopularniejszych kodowaniach na ich bezogonkowe odpowiedniki

Data dodania:
12 października 09
Autor:
Łukasz Rutkowski
Kategoria:
PHP

Chciałbym przedstawić Wam ciekawy problem, nad którym można się dosyć dużo nagłowić, a którego rozwiązanie jest notabene banalne. Chodzi mi o zamianę polskich znaków na ich odpowiedniki, ale w przypadku, kiedy w źródle mogą one być zapisane w różnych kodowaniach. Ograniczę się do UTF-8, CP1250(Windowsowe) oraz ISO. Na problem można się natknąć, kiedy użytkownicy będą Nam przesyłali pliki, a ich nazwa będzie kluczem do wykonania pewnego zadania.
Jak mówiłem, rozwiązanie jest banalne, ponieważ polega na stworzeniu tablicy z polskimi znakami, ale zapisanych w postaci kodu szesnastkowego. Najprościej i najlepiej będzie umieścić to w tablicy:

$chars = array(
    "\xb9" => "a", "\xa5" => "A", "\xe6" => "c", "\xc6" => "C",
    "\xea" => "e", "\xca" => "E", "\xb3" => "l", "\xa3" => "L",
    "\xf3" => "o", "\xd3" => "O", "\x9c" => "s", "\x8c" => "S",
    "\x9f" => "z", "\xaf" => "Z", "\xbf" => "z", "\xac" => "Z",
    "\xf1" => "n", "\xd1" => "N",
 
    "\xc4\x85" => "a", "\xc4\x84" => "A", "\xc4\x87" => "c", "\xc4\x86" => "C",
    "\xc4\x99" => "e", "\xc4\x98" => "E", "\xc5\x82" => "l", "\xc5\x81" => "L",
    "\xc3\xb3" => "o", "\xc3\x93" => "O", "\xc5\x9b" => "s", "\xc5\x9a" => "S",
    "\xc5\xbc" => "z", "\xc5\xbb" => "Z", "\xc5\xba" => "z", "\xc5\xb9" => "Z",
    "\xc5\x84" => "n", "\xc5\x83" => "N",
 
    "\xb1" => "a", "\xa1" => "A", "\xe6" => "c", "\xc6" => "C",
    "\xea" => "e", "\xca" => "E", "\xb3" => "l", "\xa3" => "L",
    "\xf3" => "o", "\xd3" => "O", "\xb6" => "s", "\xa6" => "S",
    "\xbc" => "z", "\xac" => "Z", "\xbf" => "z", "\xaf" => "Z",
    "\xf1" => "n", "\xd1" => "N",
);

Powyższą tablicę wykorzystamy za pomocą funkcji strtr(). Nie jest to nic skomplikowanego. Dla przykładowej zmiennej $string takowe działanie będzie wyglądało tak:

$string = strtr($string, $chars);

No i to by było tyle. Dla ciekawych dodam, że powyższą tablicę można rozszerzyć o kolejne kodowania, choć, te 3 w większości przypadków wystarczają.

~Łukasz Rutkowski