[PHP] Jak zmienić kodowanie polskich znaków w tekscie na standard Unicode (UTF-8) i odwrotnie: z UTF-8 na ISO-8859-2?
Chcesz szybko i efektywnie zmienić kodowanie polskich znaków ze standardu ISO 8859-2 lub Windows na Unicode i odwrotnie.
Standard zapisu znaków narodowych Unicode pozwala na umieszczanie na jednej stronie znaków diaktrycznymi w wielu językach. Obsługują go wszystkie przeglądarki (bodajże od wersji 4.x).
W wielu wypadkach to czasem jedyny sposób zakodowania polskich znaków, aby były poprawnie interpretowane w różnych programach, urządzeniach (np. tel. komórkowe) i dokumentach. Zobacz jak przekonwertować tekst do standardu Unicode na dwa sposoby - za pomocą encji i binarnie.
Konwersja z ISO 8859-2 do Unicode za pomocÄ… encji, czyli symbolu &#numer;
<?
$iso = array("177","230","234","179","241","243","182","188","191",
"161","198","202","163","209","211","166","172","175");
$uni = array("ą","ć","ę","ł","ń",
"ó","ś","ź","ż",
"Ą","Ć","Ę","Ł","Ń","Ó",
"Ś","Ź","Ż");
$x="żółw szedł drogą";
for ($i=0;$i<count($iso);$i++) $iso[$i]="/".chr($iso[$i])."/";
$x = preg_replace($iso, $uni, $x);
echo $x; // żółw szedł drogą
?>
Konwersja ze standardu Windows do Unicode za pomocÄ… encji:
<?
$win = array("185","230","234","179","241","243","156","159","191",
"165","198","202","163","209","211","140","143","175");
$uni = array("ą","ć","ę","ł","ń",
"ó","ś","ź","ż",
"Ą","Ć","Ę","Ł","Ń","Ó",
"Ś","Ź","Ż");
$x="żółw szedł drogą";
for ($i=0;$i<count($win);$i++) $win[$i]="/".chr($win[$i])."/";
$x = preg_replace($win, $uni, $x);
echo $x; // żółw szedł drogą
?>
Zasada działania obu programów jest identyczna. Pierwsza tablica ($iso lub $win) przechowuje kody liter w standardzie ISO lub Windows. Druga tablica przechowuje znaki zakodowanie w standardzie Unicode. Nasz napis znajduje się w zmiennej $x.
Jedną z najszybszych metod jest wykorzystanie funkcji preg_replace(), której jako parametry można przekazać tablice. Zamieni one znaki do standardu Unicode.
Pierwsza pętla powoduje, że każdy element tablicy uzupełniany jest o ukośniki, które niezbędne są dla tablicy wejściowej ponieważ musi być ona zapisana jako wyrażenie regularne. Tablice zapisane są jako kody ASCII i w pętli zamienianie są od razu na znaki.
Czemu od razu nie wpisałem znaków? Można je umieścić bezpośrednio, jednak nie każdy system umożliwia poprawne ich wpisanie lub wyświetlenie. Liczby można podać bez narażania się na kłopoty systemowe.
Zamiana do postaci binarnej wygląda identycznie, tylko musisz zamiast poprzedniej tabeli $uni wstawić poniższą:
$uni = array("\xC4\x85", "\xC4\x87", "\xC4\x99", "\xC5\x82", "\xC5\x84",
"\xC3\xB3", "\xC5\x9B", "\xC5\xBA", "\xC5\xBC",
"\xC4\x84", "\xC4\x86", "\xC4\x98", "\xC5\x81", "\xC5\x83",
"\xC3\x93", "\xC5\x9A", "\xC5\xB9", "\xC5\xBB");
Kodowanie binarne jest wydajniejsze, bo zamienia litery na poziomie bajtów, a nie znaków zapisanych na stronie.
Aby przekonwertować znaki z binarnego Unikodu (UTF-8) na ISO-8859-2 musisz wykonać czynność odwrotną:
<?
$iso = array("177","230","234","179","241","243","182","188","191",
"161","198","202","163","209","211","166","172","175");
$uni = array("\xC4\x85", "\xC4\x87", "\xC4\x99", "\xC5\x82", "\xC5\x84",
"\xC3\xB3", "\xC5\x9B", "\xC5\xBA", "\xC5\xBC",
"\xC4\x84", "\xC4\x86", "\xC4\x98", "\xC5\x81", "\xC5\x83",
"\xC3\x93", "\xC5\x9A", "\xC5\xB9", "\xC5\xBB");
$x="żółw szedł drogą"; // zakodowane w UTF-8 binarnym
for ($i=0;$i<count($uni);$i++) $uni[$i]="/".$uni[$i]."/";
for ($i=0;$i<count($iso);$i++) $iso[$i]=chr($iso[$i]);
$x = preg_replace($uni, $iso, $x);
echo $x; // ten sam napis w ISO-8859-2
?>
Aby przekonwertować znaki z Unikodu (UTF-8) zapisanego za pomocą encji na ISO-8859-2 musisz wykonać podobny skrypt:
<?
$iso = array("177","230","234","179","241","243","182","188","191",
"161","198","202","163","209","211","166","172","175");
$uni = array("ą","ć","ę","ł","ń",
"ó","ś","ź","ż",
"Ą","Ć","Ę","Ł","Ń","Ó",
"Ś","Ź","Ż");
$x="żółw szedł drogą"; // UTF-8 za pomocÄ… encji
for ($i=0;$i<count($uni);$i++) $uni[$i]="/".$uni[$i]."/";
for ($i=0;$i<count($iso);$i++) $iso[$i]=chr($iso[$i]);
$x = preg_replace($uni, $iso, $x);
echo $x; // żółw szedł drogą (w ISO-8859-2)
?>