String::webalize místo í to vrátí prázdný znak
- mcmatak
- Člen | 504
bohužel nevím kudy do této chyby, chyba bude v použití iconv, ale kde hledat nedostatky?
např.
„televizní“ převede na „televizn“
na win to funguje na linuxu
<?php
php 5.3.2
iconv support enabled
iconv implementation glibc
iconv library version 2.3.4
?>
to prostě nerozjedu
máte někdo nápad jak do této chyby?
díky
po několika hodinách hraní si se serverem jsem webalize nerozjel, php 5.3.3 vyzkoušeno více verzí, bohužel nepomohlo nic
jedine řešení návrat k původní webalize fci
<?php
public static function webalize($s, $charlist = NULL, $lower = TRUE)
{
$s = strtr($s, '`\'"^~', '-----');
if (ICONV_IMPL === 'glibc') {
$s = @iconv('UTF-8', 'WINDOWS-1250//TRANSLIT', $s); // intentionally @
$s = strtr($s, "\xa5\xa3\xbc\x8c\xa7\x8a\xaa\x8d\x8f\x8e\xaf\xb9\xb3\xbe\x9c\x9a\xba\x9d\x9f\x9e\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",
"ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt");
} else {
$s = @iconv('UTF-8', 'ASCII//TRANSLIT', $s); // intentionally @
}
$s = str_replace(array('`', "'", '"', '^', '~'), '', $s);
if ($lower) $s = strtolower($s);
$s = preg_replace('#[^a-z0-9' . preg_quote($charlist, '#') . ']+#i', '-', $s);
$s = trim($s, '-');
return $s;
}
?>
Editoval mcmatak (8. 8. 2010 23:37)
- mcmatak
- Člen | 504
no test php jsou pouze vytahnute fce z nette
<?php
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
function webalize($s, $charlist = NULL, $lower = TRUE)
{
$s = strtr($s, '`\'"^~', '-----');
if (ICONV_IMPL === 'glibc') {
$s = @iconv('UTF-8', 'WINDOWS-1250//TRANSLIT', $s); // intentionally @
$s = strtr($s, "\xa5\xa3\xbc\x8c\xa7\x8a\xaa\x8d\x8f\x8e\xaf\xb9\xb3\xbe\x9c\x9a\xba\x9d\x9f\x9e\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",
"ALLSSSSTZZZallssstzzzRAAAALCCCEEEEIIDDNNOOOOxRUUUUYTsraaaalccceeeeiiddnnooooruuuuyt");
} else {
$s = @iconv('UTF-8', 'ASCII//TRANSLIT', $s); // intentionally @
}
$s = str_replace(array('`', "'", '"', '^', '~'), '', $s);
if ($lower) $s = strtolower($s);
$s = preg_replace('#[^a-z0-9' . preg_quote($charlist, '#') . ']+#i', '-', $s);
$s = trim($s, '-');
return $s;
}
function webalize2($s, $charlist = NULL, $lower = TRUE)
{
$s = strtr($s, '`\'"^~', '-----');
if (ICONV_IMPL === 'glibc') {
setlocale(LC_CTYPE, 'en_US.UTF-8');
}
$s = @iconv('UTF-8', 'ASCII//TRANSLIT', $s); // intentionally @
$s = str_replace(array('`', "'", '"', '^', '~'), '', $s);
if ($lower) $s = strtolower($s);
$s = preg_replace('#[^a-z0-9' . preg_quote($charlist, '#') . ']+#i', '-', $s);
$s = trim($s, '-');
return $s;
}
$s = "televizní stolky";
echo $s;
echo "<br/>";
echo webalize($s);
echo "<br/>";
echo webalize2($s);
?>
samozrejme pokud jede aplikace pod nette tak by se pres config.ini melo nastavit utf8 viz výše
Editoval mcmatak (11. 8. 2010 16:13)
- jtousek
- Člen | 951
Zkoušel jsem kde co, ale nepodařilo se mi nijak nasimulovat situaci s chybou (vše funguje).
Zkus ještě odstranit řádek
setlocale(LC_CTYPE, 'en_US.UTF-8');
ve webalize2 jestli to
něco změní.
Jestli ne, doporučuju podědit si String, nahradit webalize původní metodou a volat v aplikaci ten zděděný. Díky namespacům by to neměl být až takový problém.
- mcmatak
- Člen | 504
no tak webalize využívá presenter link atd. ne? kazdopádně udělal jsem si patch do nette, a nejspíš to bude buď bug v php anebo nevhodně použitá funkce, která v php nikdy pořádně nefungovala :)
stejný problém jsem měl kdysi na PHP 5.2.5 tam to sice fungovalo ale třeba ta funkce běžela 15 sekund
- David Grudl
- Nette Core | 8228
glibc dělá převod ASCII//TRANSLIT blbě, proto to webalize() obcházela převodem přes WINDOWS-1250. Jakub Vrána mi pak poradil, že se dá chyba glibc obejít přes setlocale, což mi skutečně všude fungovalo, ale jak se ale zdá, existují i konfigurace, kde to nefunguje. Vrátím tedy původní implementaci, koneckonců není moc dobré, aby webalize() měla jako vedlejší efekt změnu locale.
- VeN
- Člen | 46
Davide, jelikož se používá trik s převodem na Windows-1250, je to využitelné pouze pro středoevropské abecedy, je to tak?
Pokud budu používat znaky z jiné než středoevropské abecedy, je velice pravděpodobné, že funkce toAscii (a tím i webalize) nebude převádět na 100 % správně. Mám pravdu?
- Jan Jakeš
- Člen | 177
Ono to těch znaků s diakritikou pochytí poměrně hodně, ale pokud to chceš vzít komplexněji, tak asi jedině http://d3s.mff.cuni.cz/…/phpaccents/. A pozor, tu funkci by bylo ideální přepsat na HEX kódy a šla by i trochu optimalizovat!