PDA

Pogčedajte punu verziju : iconv


zoki
08. 06. 2006., 20:26
Pošto hoću da kreiram nice and clean URLs od naslova koji se čupaju iz baze u UTF-8 formatu, potrebno je da te naslove konvertujem u ISO-8859-1 kako bi se prikazao u URL-u lepo.

koristim nešto ovako

$string = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string);

ovo //TRANSLIT piše u manualu da će se karakter prevesti u najsličniji njemu ako ne može tačno baš.


međutim neće lepo da radi, npr kreira mi od naslova koji glasi

Riverpsyde (Tiszapüspöki) and Protoneon.hu

kreira URL:

http://kalendar.psygarden.org/event/124-riverpsyde-tiszap�sp�ki-and-protoneonhu

encoding stranice je UTF-8.

http://kalendar.psygarden.org

ivanhoe
08. 06. 2006., 22:11
nisam to nikad koristio, ali mozes da probas sa ovim kodom (mada ni njega nisam koristio :) ):

$str_iso8859_1 = preg_replace( "/([\xC2\xC3])([\x80-\xBF])/e",
"chr(ord('\\1')<<6&0xC0|ord('\\2')&0x3F)",
$str_utf8);

cvele
09. 06. 2006., 11:52
Pomoglo bi kada bi rekao sta dobijas bez //TRANSLIT mrzi me da testiram sada.
U sustini jedini trenutak kada sam imao problem sa ovom konverzijom jeste kada sam morao da prevedem m$ office karaktere. (produzeni minus) To sam resio tako sto sam radio str_replace. Ako je to i tvoj problem jednostavno zameni produzeni minus (cini mi se da je 0x96 mada nisam siguran) sa obicnim minusom, isto mozes da uradis sa svim ostalim karakterima koji ti prave problem, sigurno ih nema mnogo.

Sto se //TRANSLIT tice on ce ti retko pomoci u onome sto zelis da postignes. On je zaista zamenio sa slicnim karakterima, ali problem je u tome sto ni ti karakteri nisu url firendly.

I jos kao dodatak evo kako sam ja resavao problem url-ova.


function keyword_url ($string) {

$keyword_array = explode(" ", strtolower($string));

for ($j=0; $j<count($keyword_array); $j++)
{
$patterns = array(
";", "@", "?", ":", "=", "&",
"<", ">", '"', "#", "[", "]",
"%", "{", "}", "|", "^", "~",
"/", "\\", "`", "$", "-", "'", " - ",
"´", "(", ")", ".", ",", "*", "-", "--",
" ;", " @", " ?", ":", "=", "&",
" < ", " > ", ' " ', " # ", " [ ", " ] ",
" % ", " { ", " } ", " | ", " ^ ", " ~ ",
" / ", " \\ ", " ` ", " $ ", " - ", " ' ",
"´ ", " ( ", " ) ", " . ", " , ", " * ",
" - ", " -- "," "
);
$replacements = "";
$keyword_array[$j] = str_replace($patterns, $replacements, $keyword_array[$j]);
}
$keyword_array = array_unique($keyword_array);
//common
$replacements = "";
$no = count($keyword_array);
for ($i=0; $i<$no; $i++) {
if (strlen($keyword_array[$i])>2) {
$keyword_array1[$z] = $keyword_array[$i];
$z++;
}
}
$keyword_string = implode("-", $keyword_array1);
$keyword_array = str_replace("--", "-", $keyword_string);

return $keyword_array;
}


i razne varijacije na istu temu...

MorenoArdohain
09. 06. 2006., 12:06
Cvele, nije ti bas dobra funkcija, posto ne barata sa Unicode karakterima

Evo sta bi on dobio:
riverpsyde-tiszapüspöki-and-protoneonhu

A inace, tvoja funkcija je mogla i krace, sve nestandardne karaktere pretvara u -
$url=stripslashes($string);
$url=preg_replace('|\'|', '', $url);
$url=preg_replace('|[^a-z0-9]|i', '-', $url);
$url=preg_replace('|--+|i', '-', $url);
$url=preg_replace('|^-|i', '', $url);
$url=preg_replace('|-$|i', '', $url);

Edit: tek sad skontah da Cvele nije ni rekao da to radi sa Unicode LOL, sorry :)

cvele
09. 06. 2006., 14:38
znam da je mogla i krace ali posto sam duduk za regexp (a mrzi me da nesto radim povodom toga) to izgleda tako kako izgleda :)

zoki
09. 06. 2006., 17:22
rešio sam, tj promašio sam bio out encoding... mada sad kad naiđe na Unicode character, ignoriše ga, tj samo ga izbacuje. Bolje i to nego da stavlja Unicode.

evo celokupne funkcije za clean url:


$string = iconv("UTF-8", "ISO-8859-5//TRANSLIT", $string);

$string = strtolower($string);
$string = preg_replace("/[ ]/", "-", $string);
$string = preg_replace("/[.,:;\/!?\"\'\\<>@#$%^&*()_+=]/", "", $string);
$string = preg_replace("/(-){2,}/", "-", $string);
$string = preg_replace("/(-)+$/", "", $string);
$string = preg_replace("/^(-)+/", "", $string);

return $string;


sve spacove pretvara u crtice, onda sve one specijalne karaktere "seče", uklanja crtice sa početka ili kraja, i ako ima 2 ili više crtice, pretvara ih u jednu.