String::webalize místo í to vrátí prázdný znak

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
mcmatak
Člen | 499
+
0
-

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)

Ondřej Mirtes
Člen | 1536
+
0
-

Jsi si jisty, ze je puvodni string v UTF-8?

mcmatak
Člen | 499
+
0
-

ano,
www.tvdecor.cz/test.php

Editoval mcmatak (9. 8. 2010 0:05)

repli2dev
Člen | 57
+
0
-

Něco podobného se mi stalo, když jsem používal webalize:

  1. Mimo Nette
  2. Na stanici s windows
jtousek
Člen | 951
+
0
-

Jak máš nastavenou direktivu iconv.internal_encoding?

mcmatak
Člen | 499
+
0
-

php.iconv.internal_encoding = „UTF-8“

jtousek
Člen | 951
+
0
-

Ok, můžeš ukázat phpinfo();?

mcmatak
Člen | 499
+
0
-

http://www.tvdecor.cz/phpinfo.php bude tam za cca 1 minutu

jtousek
Člen | 951
+
0
-

Podle tohoto phpinfo máš iconv.input_encoding = ISO-8859–1, potřebuji přesně tu konfiguraci, kterou má ten tvůj test.php v době kdy souštíš webalize abych mohl porovnat direktivy.

mcmatak
Člen | 499
+
0
-

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
+
0
-

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 | 499
+
0
-

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

Panda
Člen | 569
+
0
-

mcmatak napsal(a):

no tak webalize využívá presenter link atd. ne?

Nevyužívá.

David Grudl
Nette Core | 8144
+
0
-

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.

mcmatak
Člen | 499
+
0
-

ok, dík

VeN
Člen | 46
+
0
-

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
+
0
-

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!

kravčo
Člen | 721
+
0
-

len tak pre zaujímavosť: glibc 2.3.4 pochádza z počiatku roka 2005, rovnako ako php 4.3.x a 5.0.x

skúsil by som aktualizovať alebo napísať na hosting, či sú normálni…

mcmatak
Člen | 499
+
0
-

len tak pre zaujímavost, u php platí čím starší tím větší šance, že to bude fungovat, glibc je jedna z nejméně spolehlivých knihoven, často prostě nové verze nefungují