Autor Zpráva
MartinXYZ
Profil *
Ahoj,

prosím o pomoc, celý den si s tím lámu hlavu, ale nedaří se mi...

Nastíním jednoduchý příklad:
<?php
$title = file_get_contents("http://www.adresa.cz");
preg_match('~<title>(.+)</title>~Usi', $title, $title_out);
$nazev = $title_out[1];
echo $nazev;
?>

Skript vytáhne ze zadané adresy její název (to, co je mezi tagy TITLE). Stránku se skriptem mám kodovanou v UTF-8. Pokud tahám název ze stránek, které mají charset nastavený na UTF-8, není problém. Ale pokud tahám název ze stránky, která má charset např. windows-1250, zobrazí se mi místo znamének s diakritikou pouze nesmysly...

Zkoušel jsem všechno možné, prohledal internet a nic. Zkoušel jsem i toto, ale bez úspěchu:
...
echo mb_convert_encoding($nazev, "UTF-8");

Věděl by prosím někdo, jak na to? :-)

Děkuji moc,
Martin
Alphard
Profil
A jaké je původní kódování? Možná ho zkusit explicitně nastavit.
Zkuste to prohnat zde uvedenou funkcí autoUTF().
MartinXYZ
Profil *
Moje stranka se skriptem ma kodovani UTF-8. Stranky, ze kterych ziskavam nazvy, maji pokazde jine kodovani (UTF-8, windows-1250, ...).
Kdyz ziskavam nazev ze stranek, ktere maji jine nez UTF-8 kodovani, vvznikne problem se zobrazenim znaku...
Alphard
Profil
Proto jsem navrhoval zkusit to autoUTF().
MartinXYZ
Profil *
Ok, děkuju, snad to pomůže :-).
Ale mohl bys mi, prosím, lehce nastínit, jak mám tu funkci dostat do svého kódu? S PHP teprve začínám a opravdu si s tím nevím rady :-(.


Zkusil jsem to nějak zbastlit. Je to takto správně?
<?php
function autoUTF($s)
{
    // detect UTF-8
    if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s))
        return $s;

    // detect WINDOWS-1250
    if (preg_match('#[\x7F-\x9F\xBC]#', $s))
        return iconv('WINDOWS-1250', 'UTF-8', $s);

    // assume ISO-8859-2
    return iconv('ISO-8859-2', 'UTF-8', $s);
}


$title = file_get_contents("http://www.adresa.cz");
preg_match('~<title>(.+)</title>~Usi', $title, $title_out);
$nazev = $title_out[1];
echo autoUTF($nazev);
?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: