[php] Problém s diakritikou

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Víťa1 16. 7. 2015 16:20

Mám takový problém
Kód: Vybrat vše
<html>
<head>
..
..
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"
..
..

$umisteni= file_get_contents("http://seznam.cz");
$promo = (StrTr(strip_tags($umisteni), "ÁÄČÇĎÉĚËÍŇÓÖŘŠŤÚŮÜÝŽáäčçďéěëíňóöřšťúůüýž", "AACCDEEEINOORSTUUUYZaaccdeeeinoorstuuuyz"));
$search = "Region";
  $pozicia = strpos($promo, $search ); // zistí pozíciu kde sa nachádza $search v $promo
  $dlzka = strlen($search); // dĺžka $search
  $usekni_od = $pozicia + $dlzka; // odkiaľ sa má ustrihnúť $promo
  $string = substr($promo, $usekni_od - 0,70);
echo $string;


Při výpisu pomocí echo na pozicích s diakritikou se zobrazují nesmysly kde je chyba? díky
Promiňte mi. takové triviální otázky ale jsem samouk a androidí embryo Mám WIN8.1
Víťa1
Junior
Uživatelský avatar

Odeslat příspěvekod karlos00x 16. 7. 2015 17:26

1) v cem to pises? ukladas soubory jako UTF-8 bez BOM?
2) fakt jsi nenasel reseni? proc se snazis neco takhle lepit kdyz neumis pouzit google?
3) http://lmgtfy.com/?q=php+substr+utf8
Upgrade který má smysl: SSD. Zažijete svižný počítač.
karlos00x
Pokročilý

Odeslat příspěvekod Haunter 16. 7. 2015 21:25

Admine nechceš toho trolla zabanovat?:-D
Haunter
Junior
Uživatelský avatar

Odeslat příspěvekod karlos00x 16. 7. 2015 23:38

treba neni troll jen tak hloupej.
Upgrade který má smysl: SSD. Zažijete svižný počítač.
karlos00x
Pokročilý

Odeslat příspěvekod Pavel Černík 17. 5. 2016 11:07

Problem je ve funkci Strtr(), ktera vypada jako idealni reseni na odstraneni diakritiky avsak neumi multibyte (tzn diakritiku) a tim padem fatalne pri prekladu selze.
autor by potreboval neco jako "mb_strtr()" ale to neexistuje, takze jedine reseni je str_replace() , ktere multibyte znaky podporuje.

Jako trollovani mi tento dotaz nepripada. Je to bezny problem u zacatecniku, kteri neznaji rozdil mezi multibyte-safe a unsafe funkcemi. Na toto tema moc clanku nebyva
Pavel Černík
Junior

Odeslat příspěvekod gandor 17. 5. 2016 19:33

iconv a translit? Urcite si to vygooglil ked si hladal "strip accents php"...

Naco robit veci jednoducho, ked idu zlozite ;) Aj ked to tak vyzera, toto nieje provokacia - toto je dobre mienena rada, ze veci ktore sa notoricky opakuju uz urcite niekto vyriesil a spravil pre to nejaku jednoduchu podporu...
gandor
Mírně pokročilý

Odeslat příspěvekod Pavel Černík 18. 5. 2016 08:48

Přesto že nejsem tazatel, díky gandore za zajímavý podmět.
Naneštěstí je to nespolehlivé - asi záleží na nastavení serveru nebo bůhví čem.
Konkrétně jsem zkusil: (převzato z http://stackoverflow.com/questions/1017 ... php-string )
Kód: Vybrat vše
$input = "Příliš žluťoučký kůň úpěl ďábelské ódy.";
setlocale(LC_ALL, "en_US.utf8");
$output = iconv("utf-8", "ascii//TRANSLIT", $input);
print($output);

S tím že výsledkem na mém localhostu je
Pr'ilis zlutouck'y kun 'upel d'abelsk'e 'ody.

To je nepřijatelné. Zatím jsem v projektech vždy používal str_replace() s ruční definicí překladu, který funguje vždy a všude bez ohledu na nastavení serveru.
Rozhodně bych tedy netvrdil že iconv() je jednodušší. Není, protože pro začátečníky představuje nepřekonatelný problém v nastavování serveru.

Určitě se rád nechám poučit ale prozatím mi přijde str_replace() vhodnější pro rady začátečníkům, protože ti jasně vidí jaký znak nahrazují za jaký. K čemu je "magická funkce" když neví co přesně dělá a navíc ke své funkci potřebuje spešl nastavení?
Naposledy upravil Pavel Černík dne 18. 5. 2016 09:56, celkově upraveno 2
Pavel Černík
Junior

Odeslat příspěvekod Just_jo 18. 5. 2016 09:14

Tak ono je blbost použít setlocale s "en_US.utf8" když text rozhodně en_US není.
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod Pavel Černík 18. 5. 2016 09:36

Zkusil jsem samozřejmě i "cs_CZ" i "cs_CZ.utf8" i "czech". Ani jedno nepomohlo. (problémy zmiňují i na https://cs.wikibooks.org/wiki/PHP_prakt ... diakritiky )

edit: Asi mám vysvětlení, viz článek pana Grudla: https://phpfashion.com/odstraneni-diakr ... h-kodovani
Mějte na paměti, že iconv vloží do textu znaky jako " ' ^, aby vizuálně diakritiku imitoval. Dále je nutné dát pozor na implementaci iconv – zjistíte ji přes phpinfo(). Zatímco libiconv funguje korektně, glibc nahradí české znaky za otazníky.


Prostě tady platí to co psal gandor: "Naco robit veci jednoducho, ked idu zlozite". A ať si říká kdo chce co chce, funkce iconv() je očividně ta složitá cesta.

edit2: soubor samozřejmě je v UTF bez BOM.
Naposledy upravil Pavel Černík dne 18. 5. 2016 10:06, celkově upraveno 1
Pavel Černík
Junior

Odeslat příspěvekod Just_jo 18. 5. 2016 09:41

Mě osobně funguje toto
Kód: Vybrat vše
setlocale(LC_CTYPE, 'cs_CZ');
iconv("UTF-8", "ASCII//TRANSLIT", $text);


Taky bude záležet na kódování souboru. Nelze mít soubor s textem uložený jako ASCII a převádět z UTF8 na ASCII ( protože zdroj není utf8 )
Just_jo
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků