usuwanie znaków specjalnych z kodowania iso-8859-2 latin2

Często zachodzi potrzeba zamiany ogonków na ich graficzne odpowiedniki bez ogonków w kodowaniu ASCII. Najczęściej służy to do przygotowania tekstu wo wyświetlenia w adresie urluri. Lecz niestety jest to zależne od użytego kodowania na stronie jak i bazie danych MYSQL.

Ponieważ najczęściej wykorzystujemy podmianę znaków specjalnych, narodowych, diakrytycznych w przygotowywaniu przyjaznych adresów – friendly URL ze słowami kluczowymi dlatego też potrzebujemy dynamicznej funkcji która to zrobi za nas automatycznie.

Tutaj prezentuję tablice oraz funkcje specjalnie dla kodowania iso-8859-2, znanego pod nazwą latin2, jeszcze inna nazwa to ISO/IEC 8859-2 jak i kodowanie środkowoeuropejskie oraz wschodnioeuropejskie. Może jest to dosć zacofane kodowanie lecz nadal często używane na stronach WWW oraz bazach mysql (latin2) ze względu na obsługę polskich znaków diakrytycznych.

Kodowanie iso-8859-2 obsługuje takie języki jak (pod względem znaków narodowych – specjalnych):

  • Polski
  • Bośniacki
  • Chorwacki
  • Czeski
  • Węgierski
  • Serbski (w transkrypcji łacińskiej)
  • Serbsko-Chorwacki
  • Słowacki
  • Słoweński
  • Górnołużycki
  • Dolnołużycki
  • Angielski
  • Niemiecki
  • sporną kwestią jest język Fiński

Jednakże zalecą się stosowanie kodowań zgodnych z Unicode np. utf-8, ponieważ mimo iż iso-8859-2 wydaje się obsługiwać wiele języków obsługuje ono tylko podstawy i w swoim asortymencie posiada tylko niewiele znaków specjalnych, oraz cała tablica kodowania jest skromna.

O co chodzi w tej konwersji iso-8859-2 to ASCII, otóż o to by zamienić np. nasze polskie ć na jego odpowiednik c który może być obsłużony w adresach URL przez przeglądarki i niestety trzeba postąpić tak z każdym zadaszkowanym i ogonkowym znakiem. Ř -> R i tym podobne…

Poniżej przedstawiam tablice do użytku nie komercyjnego, które ostatnio sobie stworzyłem do przygotowania przyjaznych adresów w kodowaniu iso-8859-2. Są niewrażliwe na kodowanie pliku w którym są zapisane ponieważ korzystają z wartości heksadecymalnych popularnie zwane HEX. Zamieniają każdy znak na jego graficzny odpowiednik, działają z wielkimi jak i małymi literami! Oczywiście zamieniają także polskie znaki!

$map_latin2=array(
"\xa1","\xa3","\xa5","\xa6","\xa7","\xa9","\xaa","\xab","\xac","\xae","\xaf",
"\xb1","\xb3","\xb5","\xb6","\xb9","\xba","\xbb","\xbc","\xbe","\xbf","\xc0",
"\xc1","\xc2","\xc3","\xc4","\xc5","\xc6","\xc7","\xc8","\xc9","\xca","\xcb",
"\xcc","\xcd","\xce","\xcf","\xd0","\xd1","\xd2","\xd3","\xd4","\xd5","\xd6",
"\xd7","\xd8","\xd9","\xda","\xdb","\xdc","\xdd","\xde","\xdf","\xe0","\xe1",
"\xe2","\xe3","\xe4","\xe5","\xe6","\xe7","\xe8","\xe9","\xea","\xeb","\xec",
"\xed","\xee","\xef","\xf0","\xf1","\xf2","\xf3","\xf4","\xf5","\xf6","\xf8",
"\xf9","\xfa","\xfb","\xfc","\xfd","\xfe",
);
//Tablice znakow diakrytycznych 
//dla kodowania iso-8859-2 (latin2)
//by tosiek - https://tosiek.pl/
$map2_latin2=array(
"\x41","\x4c","\x4c","\x53","\x53","\x53","\x53","\x54","\x5a","\x5a","\x5a",
"\x61","\x6c","\x6c","\x73","\x73","\x73","\x74","\x7a","\x7a","\x7a","\x52",
"\x41","\x41","\x41","\x41","\x4c","\x43","\x43","\x43","\x45","\x45","\x45",
"\x45","\x49","\x49","\x44","\x44","\x4e","\x4e","\x4f","\x4f","\x4f","\x4f",
"\x78","\x52","\x55","\x55","\x55","\x55","\x59","\x54","\x73\x73","\x72","\x61",
"\x61","\x61","\x61","\x6c","\x63","\x63","\x63","\x65","\x65","\x65","\x65",
"\x69","\x69","\x64","\x64","\x6e","\x6e","\x6f","\x6f","\x6f","\x6f","\x72",
"\x75","\x75","\x75","\x75","\x79","\x74",
);

Na pierwszy rzut oka nie są czytelne, lecz poniżej prezentuję ich wersję z której odradzam korzystać, ponieważ taki plik z poniższymi tablicami musi być bezwzględnie zapisany w kodowaniu iso-8859-2 (trzeba się pilnować), także do użytku niekomercyjnego:

$map_latin2=array(
'Ą','Ł','Ľ','Ś','§','Š','Ş','Ť','Ź','Ž','Ż',
'ą','ł','ľ','ś','š','ş','ť','ź','ž','ż','Ŕ',
'Á','Â','Ă','Ä','Ĺ','Ć','Ç','Č','É','Ę','Ë',
'Ě','Í','Î','Ď','Đ','Ń','Ň','Ó','Ô','Ő','Ö',
'×','Ř','Ů','Ú','Ű','Ü','Ý','Ţ','ß','ŕ','á',
'â','ă','ä','ĺ','ć','ç','č','é','ę','ë','ě',
'í','î','ď','đ','ń','ň','ó','ô','ő','ö','ř',
'ů','ú','ű','ü','ý','ţ',
);
//Tablice znakow diakrytycznych 
//dla kodowania iso-8859-2 (latin2)
//by tosiek - https://tosiek.pl/
$map2_latin2=array(
'A','L','L','S','S','S','S','T','Z','Z','Z',
'a','l','l','s','s','s','t','z','z','z','R',
'A','A','A','A','L','C','C','C','E','E','E',
'E','I','I','D','D','N','N','O','O','O','O',
'x','R','U','U','U','U','Y','T','ss','r','a',
'a','a','a','l','c','c','c','e','e','e','e',
'i','i','d','d','n','n','o','o','o','o','r',
'u','u','u','u','y','t',
);

Posiadając tablice znaków diakrytycznych możemy zamienić te znaki na ich odpowiedniki – funkcja str_replace(), lecz to nie jest całkowite przygotowanie adresów URL należy się także pozbyć znaków specjalnych, przestankowych i tym podobnych, które nie są obsługiwane w adresach. Tutaj wykorzystamy wyrażenia regularne (regular expressions) – funkcja preg_replace(), które zamienią każdy znak nie wchodzący w skład wyrazów na myślniki (-) lub podkreślniki – znaki podkreślenia (_), zależy kto jak woli, następnie musimy usunąć te znaki z początku i końca, wykorzystamy funkcję trim() z dodatkowym parametrem.

Ci którzy chcą by adresy były złożony tylko z małych liter muszą użyć funkcji strtolower()

Adresy URL – URI ze słowami kluczowymi

Wiec zaczynamy sobie pisać funkcję specialchar_latin2() która jako jedyny argument przyjmuje ciąg który przygotowuje do wyświetlenia adresu URL:

function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	return $url;
}

Należy pamiętać by tablice ze znakami narodowymi były zdefiniowane poza – przed funkcją. Ciąg zażółć?gęślą !?jaźń;;\ZAŻÓŁĆ []GĘŚLĄ (JAŹŃ-- po przejściu przez tę funkcję będzie miał postać: zazolc?gesla !?jazn;;\ZAZOLC []GESLA (JAZN–, nie nadaje się do wykorzystania w adresie.
Jak na razie funkcja zamienia tylko znaki narodowe z tablic, dodajmy do niej wyrażenie regularne zamieniające wszystko co nie jest znakiem wchodzącym w skład słów i występujące jeden raz lub więcej na myślnik – (kto woli podkreślnik _), posłużymy się zdefiniowaną klasą negującą znaki wchodzące w skład słów \W

function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	$url = preg_replace('#[\W]{1,}#','-',$url);
	return $url;
}

Teraz zamieniamy wszystko co zbędne (spacje, wykrzykniki, znaki zapytanie i tym podobne na myślniki. Ciąg zażółć?gęślą !?jaźń;;\ZAŻÓŁĆ []GĘŚLĄ (JAŹŃ-- po przejściu przez funkcję miałby postać: zazolc-gesla-jazn-ZAZOLC-GESLA-JAZN-, lecz jak widać pozostał myślnik na końcu, może także czasami pozostać na początku co jest całkowicie zbędne, użyjemy funkcji trim() do jego usunięcia:

function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	$url = preg_replace('#[\W]{1,}#','-',$url);
	$url = trim($url,'-');
	return $url;
}

Teraz ciąg miałby postać: zazolc-gesla-jazn-ZAZOLC-GESLA-JAZN, a co jeśli byśmy chcieli by składał się z małych estetycznych liter? Wystarczy skorzystać z funkcji strtolower() zamieniającej wielkie litery na małe.

function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	$url = preg_replace('#[\W]{1,}#','-',$url);
	$url = trim($url,'-');
	$url = strtolower($url);
	return $url;
}

Teraz otrzymujemy oczekiwany efekt zazolc-gesla-jazn-zazolc-gesla-jazn, zamienione znaki narodowe na ich odpowiedniki, spacje i inne znaki specjalne zamienione na myślniki (lub podkreślniki) oraz cały ciąg pisany mała czcionką bez wielkich liter. Taki ciąg można wykorzystać w adresie URL.

Bardzo przydatna rzecz do tworzenia przyjaznych adresów ze słowami kluczowymi. Oczywiście dla kodowania iso-8859-2, które niestety nadal jest w użyciu.

Funkcja specialchar_latin2() w ostatecznej wersji:

$map_latin2=array(
	"\xa1","\xa3","\xa5","\xa6","\xa7","\xa9","\xaa","\xab","\xac","\xae","\xaf",
	"\xb1","\xb3","\xb5","\xb6","\xb9","\xba","\xbb","\xbc","\xbe","\xbf","\xc0",
	"\xc1","\xc2","\xc3","\xc4","\xc5","\xc6","\xc7","\xc8","\xc9","\xca","\xcb",
	"\xcc","\xcd","\xce","\xcf","\xd0","\xd1","\xd2","\xd3","\xd4","\xd5","\xd6",
	"\xd7","\xd8","\xd9","\xda","\xdb","\xdc","\xdd","\xde","\xdf","\xe0","\xe1",
	"\xe2","\xe3","\xe4","\xe5","\xe6","\xe7","\xe8","\xe9","\xea","\xeb","\xec",
	"\xed","\xee","\xef","\xf0","\xf1","\xf2","\xf3","\xf4","\xf5","\xf6","\xf8",
	"\xf9","\xfa","\xfb","\xfc","\xfd","\xfe",
);
//Tablice znakow diakrytycznych 
//dla kodowania iso-8859-2 (latin2)
//by tosiek - https://tosiek.pl/
$map2_latin2=array(
	"\x41","\x4c","\x4c","\x53","\x53","\x53","\x53","\x54","\x5a","\x5a","\x5a",
	"\x61","\x6c","\x6c","\x73","\x73","\x73","\x74","\x7a","\x7a","\x7a","\x52",
	"\x41","\x41","\x41","\x41","\x4c","\x43","\x43","\x43","\x45","\x45","\x45",
	"\x45","\x49","\x49","\x44","\x44","\x4e","\x4e","\x4f","\x4f","\x4f","\x4f",
	"\x78","\x52","\x55","\x55","\x55","\x55","\x59","\x54","\x73\x73","\x72","\x61",
	"\x61","\x61","\x61","\x6c","\x63","\x63","\x63","\x65","\x65","\x65","\x65",
	"\x69","\x69","\x64","\x64","\x6e","\x6e","\x6f","\x6f","\x6f","\x6f","\x72",
	"\x75","\x75","\x75","\x75","\x79","\x74",
);
function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	$url = preg_replace('#[\W]{1,}#','-',$url);
	$url = trim($url,'-');
	$url = strtolower($url);
	return $url;
}

Życzę miłego tworzenia przyjaznych adresów dla wyszukiwarek i użytkowników (wiesz w co klikasz widząc sam link).