lip 10 2014
[PHP] Konwersja polskich znaków
Pobierając treści z różnych źródeł w php, prędzej, czy później trafiamy na problemy z kodowaniem. Dla mnie osobiście to prawdziwa zmora, gdyż często mam do czynienia z rozproszonymi bazami różnego typu w najrozmaitszych kodowaniach. Sposobów na radzenie sobie z problemami tej natury jest wiele, jednak czasem przydatne są najprostsze funkcje konwertujące dany znak na konkretny inny… Przykład poniżej:
1 2 3 4 5 6 7 | function kon($in,$m) {$ch = array('%C5%82' => 'ł','%C4%99' => 'ę', '%C3%B3' => 'ó','%C4%85' => 'ą','%C5%9B' => 'ś','%C5%BC' => 'ż', '%C5%BA' => 'ź', '%C4%87' => 'ć','%C5' => 'ń','%20' => ' ','%C4%84' => 'Ą','%C4%86' => 'Ć', '%C4%98' => 'Ę','%C4%83' => 'Ń','%C3%93' => 'Ó','%C5%9A' => 'Ś','%C5%B9' => 'Ź','%C5%BB' => 'Ż','%C5%81' => 'Ł'); if($m==1) return str_replace(array_keys($ch),array_values($ch), $in); else if($m==2) return str_replace(array_values($ch),array_keys($ch), $in); } |
Powyższa funkcja działa jakby w dwie strony, można podmienić określone znaki z klucza na wartość, lub z wartości na klucz. Po co tak? Otóż np jeśli w danej funkcji zapisujemy link, którego chcemy użyć do polecenia curl, to posłużymy się jedną opcją, natomiast jeśli potem ten link chcemy wykorzystać do zakodowania poprawnej nazwy pliku, to posłużymy się drugą opcją i tym samym nie musimy płodzić 2 funkcji prawie identycznych.
Powyższy kodzik dotyczy kodowania Unicode w transformacji UTF-8, ale bez problemu może dotyczyć każdego innego, lub po prostu zwykłych ciągów znaków, które chcemy sobie podmienić.
Inny przykład zmiany kodowania z cp852 na ansi polskich znaków wykorzystujący w zasadzie tę samą funkcję str_replace poniżej:
1 2 3 4 5 | function translate($string) { $Windows = array('Ą','Ć','Ę ','Ł','Ń','Ó','Ś','Ź','Ż','ą','ć','ę','ł','ń','ó','ś','ź','ż'); $cp852 = array(chr(0x85),chr(143),chr(168),chr(157),chr(227),chr(224),chr(151),chr(141),chr(189),chr(165),chr(134),chr(169),chr(136),chr(228),chr(162),chr(152),chr(171),chr(190)); return str_replace($cp852,$Windows, $string); } |
Ot tyle.