Technologie i narzędzia: język PHP 5, Java, JavaScript, Python, system Zend Framework, Django, biblioteka jQuery, Smarty, platforma Eclipse, MySQL, SVN, CVS, UML, Firefox.
WebProgramming - wszystko o serwisach internetowych
O serwisach internetowych.
Rozwiązanie problemu z kodowaniem.
W tym artykule omówię rozwiązanie problemu przedstawionego w poprzednim wpisie pt. “Problem z kodowaniem” - jest ono skuteczne co najmniej w 99% przypadków - przynajmniej póki co nie udało mi się znaleźć żadnego kontrprzykładu.
Mój sposób na walkę z tym problemem polega na konwertowaniu tekstu do docelowego kodowania (czyli iso-8859-2) niezależnie od tego jakie jest kodowanie wejściowe. Brzmi prosto.. tylko skąd wiedzieć jakie to kodowanie wejściowe jest (jak pisałem w poprzednim artykule, może być jedno z trzech: win, utf, iso) - znając je bez problemu byśmy skonwertowali tekst na przykład za pomocą funkcji iconv.
Zanim przejdę do meritum, chciałbym przedstawić kilka spostrzeżeń, bez których moje “sprytne” rozwiązanie nie miałoby sensu:
- Niektóre kody polskich znaczków w kodowaniu iso i win są takie same (dla: Ę ę Ó ó Ł ł Ż ż Ć ć Ć Ń ń), dlatego nie musimy ich konwertować
- Kody polskich znaków w kodowaniu win, w kodowaniu iso nie są poprawnymi znakami występującymi w języku polskim (są po prostu “krzaczkami”)
- Kody \xc3-\xc5 (prefiksy dla polskich znaków w kodowaniu utf - patrz niżej) również nie występują w polsko-utfowej przyrodzie (oznaczają odpowiednio Ă Ä Ĺ)
Dzięki 2. i 3. nie musimy się obawiać, iż prawidłowy tekst zapisany w kodowaniu iso błędnie skonwertujemy.
Podsumowując otrzymujemy moje rozwiązanie, które nie rozpoznaje aktualnego kodowania tekstu, tylko konwertuje “na siłę”:
-
// Tablica konwertująca znaki polskie z win na iso
-
"\xa5" => "\xa1", "\xb9" => "\xb1", // Ą ą
-
"\x8c" => "\xa6", "\x9c" => "\xb6", // Ś ś
-
"\x8f" => "\xac", "\x9f" => "\xbc" // Ź ź
-
);
-
// Tablica konwertująca znaki polskie z utf na iso
-
"\xc4\x85" => "\xb1", "\xc4\x84" => "\xa1", // Ą
-
"\xc4\x87" => "\xe6", "\xc4\x86" => "\xc6", // Ć
-
"\xc4\x99" => "\xea", "\xc4\x98" => "\xca", // Ę
-
"\xc5\x82" => "\xb3", "\xc5\x81" => "\xa3", // Ł
-
"\xc3\xb3" => "\xf3", "\xc3\x93" => "\xd3", // Ó
-
"\xc5\x9b" => "\xb6", "\xc5\x9a" => "\xa6", // Ś
-
"\xc5\xba" => "\xbc", "\xc5\xb9" => "\xac", // Ź
-
"\xc5\xbc" => "\xbf", "\xc5\xbb" => "\xaf", // Ż
-
"\xc5\x84" => "\xf1", "\xc5\x83" => "\xd1" // Ń
-
);
-
-
// Tekst do skonwertowania
-
$txt = ”;
-
// Spróbuj zamienić znaczki utf na iso
-
// Nie udało się.. może jednak jest to kodowanie win
-
// Spróbuj zamienić znaczki win na iso
-
}
-
// W zmiennej $str powinien być tekst w kodowaniu iso
Na koniec mała uwaga: teoretycznie przed konwersją można by sprawdzać jakie jest kodowanie tekstu wejściowego i dopiero po tym konwertować za pomocą strtr - w niektórych przypadkach ta opcja byłaby szybsza… jednak powyżej przedstawiona jest (wg mnie) bardziej przejrzysta.
Napisz komentarz