Autor Zpráva
Stepanka
Profil *
Ahoj,
potřebovala bych nastavit správné zobrazování češtiny u výpisu z RSS kanálů jiných webů. Používám Smarty šablony, a už jsem vyzkoušela snad všechno. Mám:

1) Nastavené kódování v hlavičce šablony index.html na UTF-8. Na prvním řádku mám pro jistotu i <?xml version="1.0" encoding="UTF-8"?>

2) V souboru index.php mám jako první řádek <?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>, což jsem se dočetla zde v jiném vlákně.

3) V souboru lastRSS.php mám: var $default_cp = 'UTF-8';

4) I když píšu kód v Deramweaveru, vím, že ho musím někdy znovu-uložit např. v PSPadu, právě kvůli češtiny.. To jsem udělala taky.

Nevíte někdo, prosím, kde by mohla být ještě chyba?

Předem moc děkuju za jakékoliv návrhy, nápady a odpovědi.
Stepanka
Profil *
Ještě jsem chtěla dodat, že místo veškeré diakritiky mám otazníky.. (i když nevím nakolik je tahle informace důležitá..)
Měsíček
Profil
"I když píšu kód v Deramweaveru, vím, že ho musím někdy znovu-uložit např. v PSPadu, právě kvůli češtiny.. To jsem udělala taky. "

Stačí uložit klidně i v Dreamweaveru, ale se stejným kódováním takže ne ani ANSI, ani Unicode, ale UTF-8. V tom případě se musí shodovat kódování hlavičky, xml prologu + ještě kódování souboru.
starenka
Profil
a databaze?
Stepanka
Profil *
Měsíček
Nene... Opravdu to tak je, ze Dreamweaver má defaultně uložené nějaké kódování (tuším windows-1250) a i když člověk zadá do hlavičky něco jiného, někdy se stane, že na to Dreamweaver nereaguje. To mám odzkoušené snad stokrát a ještě vícekrát jsem to někde dočetla... Ale není to nic proti Tobě ;-) .. Jinak můj problém to stejně neřeší, protože kódování souboru je správně nastaveno na UTF-8, kódování hlavičky také a xml prolog jsem kopírovala v prvním příspěvku - taky tam zadávám UTF-8. Zdá se mi to zvláštní, není už nikde jinde místo, kam by to kódování šlo ještě vecpat.. Nechápu to..

starenka
Databázi mám také v UTF-8. Navíc po připojení k databázi zadávám ještě: mysql_query("SET NAMES 'UTF-8'"); což by mělo taky pomoct ke správnému zobrazování češtiny.. Ale jaksi mám pořád všude otazníky :-(
starenka
Profil
ono set names neni vse, spravne by bylo jeste nadefinovat kodovani klienta a prenosu.. treba takhle

private function setEncoding()
{
    if(@mysql_query('SET character_set_results=utf8',$this->connection_id) &&
       @mysql_query('SET character_set_connection=utf8',$this->connection_id) &&
       @mysql_query('SET character_set_client=utf8',$this->connection_id))
    { return true; }
    else { return false; }
}


ale bojim se, ze to tim nebude... jen tak pro sichr, kdyz se podivas pres phpmyadmina je cestina v db v pohode? nezbejva ti nic jinyho nez to zdebugovat a podivat se, kde se to posira po ceste (sic!). gl starenka
starenka
Profil
jeste ja: smarty neznam, ale neni mozny, ze si to tam nekde ve vystupu v sablonach nekde projizdi iconv na nejaky zapadacky kodovani?
Stepanka
Profil *
starenka
ehm.. co je to zdebugovat?
starenka
Profil
pouzit debugger ( http://www.thierryb.net/pdtwiki/index.php?title=Using_PDT_:_Installati on_:_Installing_the_Zend_Debugger http://en.wikipedia.org/wiki/Debugger ) to znamena (mimo jine) mit moznost prochazet skript radek po radku a videt vsechny hodnoty promennych, vidis kudy skript jde atd....
pokud nemas tak vytipovat mozny mista zmeny dat a echovat a echovat....

porad jsi jeste neodpovedela: v databazi pres phpmyadmina je cestina v poradku?
Stepanka
Profil *
starenka
Jo, promiň, v databázi přes PHPMyAdmina je čeština naprosto v pořádku. Zkusím ten debugger, ale nevím, jestli z jeho pohledu bude zobrazení otazníku bráno jako chyba.. Ale každopádně děkuju za rady!
starenka
Profil
no takhle to nefunguje...chyby to za tebe nehleda :) proste ti to umozni krokovat skript a ty budes videt obsah promennych.. tudiz snadno odhalis, jestli ti to prislo spatne uz db, nebo kde presne se ti po..skodilo :)
Stepanka
Profil *
starenka
Jo, já to chápu :-)
Ale teď jsem z toho trochu jelen. Zkusila jsem tam zadat jiny zdroj na RSS kanál, a čeština se zobrazila pěkně. Když tam dám třeba http://www.lidovky.cz/export/rss.asp?c=ln_lidovky, tak mám místo diakritiky otazníky, ale když zvolím jako RSS zdroj třeba http://rss.ceska-media.cz/, nebo http://www.novinky.cz/rss/, tak se to zobrazí normálně s háčkama a čárkama... Čím to může být?
vertigo4
Profil
Stepanka
protože mají různá kodování...
starenka
Profil
aha az ted to ctu poradne... ty negenerujes svoje, ale nacitas cizi.... no tak to zrejmne bude chyba v tom, ze ty rss co ti nejdou bud nemaji definovany kodovani, nebo to lastrss blbe prevadi iconvem... (jen hadam)
Stepanka
Profil *
Aha, už jsem si našla, co je to iconv, a pomohlo mi to. Třeba "title" RSS kanálu se začalo zobrazovat pěkně česky. Ale jednotlivé položky (odkazy na zprávy) vytvářím až v té šabloně, což není php kód, ale html dokument a tak nevím, jak tam ten iconv nacpat. Prošla jsem www.smarty.net, a nikde jsem to nenašla, tak to asi neexistuje. Nebo už jste se s tím někdy někdo potkal? Děkuju.
Stepanka
Profil *
starenka
Jo, chápeš to správně, že načítám cizí RSS. Děkuju za rady ;-)
starenka
Profil
nz. no kdysi sem v tom neco delal, tak jsem se podival. je to v nejaky fci v souboru v /smarty/plugins. je ale dost mozny, ze uz se to nachazi nekde jinde... ten projekt je par let starej :)
Stepanka
Profil *
starenka
Právě jsem prošla všechny soubory v /smarty/plugins, ale kódování se žádný netýkal.. Přitom mi tam určitě žádný nechybí.. Nebo myslíš, že by ten iconv šel nasáčkovat do té funkce v PHP kódu? Že bych to nedávala do té šablony.. Ta funkce vypadá takhle:


function smarty_function_lastrss_load($params, &$smarty) {
	if ($params['file'] == '') {
		$smarty->trigger_error("lastrss_load: missing 'file' parameter");
		return;
	}
	if ($params['assign'] == '') {
		$smarty->trigger_error("lastrss_load: missing 'assign' parameter");
		return;
	}
	
	require_once('./libs/classes/lastRSS.php');
	if(class_exists('lastRSS')) {
		$_rss =& new lastRSS();
		$_rss->cache_dir = 'libs/smarty/cache'; 
		$_rss->cache_time = 3600; // one hour
		
		if($rs = $_rss->get($params['file'])) {
			$smarty->assign($params['assign'], $rs);	
					
		} else {
			$smarty->trigger_error("lastrss_load: unable to read '{$params['file']}'");
		}
	} else {
		$smarty->trigger_error("lastrss_load: unable to load lastRSS library");
	}
}



Já už to zkoušela nacpat všude možně kolem toho řádku $smarty->assign($params['assign'], $rs);, ale pak mi asi došlo, že je to blbost, protože v tomhle skriptu ty jednotlivé odkazy ještě neexistují, protože se generují až v té šabloně... nebo nemám pravdu?

PS: Ty jsi kluk stařenko? :-)
starenka
Profil
kluk: jsem :)

no intuitivne bych rekl ze data uz budes mit nasackovany v promenny $rs... koukni se co je v ni...

to lastrss je tohle? http://lastrss.oslab.net/ ? porad me udivuje, ze to nekonvertuje samo a dobre... pokud je to ono... nechej si vypsat data pred a po tehle radce ( $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]); ), popripade se koukni jake jsou ty prommene ($this->cp a $this->rsscp) a jestli jsou v poradku (kodovani v xml rsska a tocje default)
Stepanka
Profil *
V proměnné $rs je pole, které zobrazuje například toto:

echo $rs; ...zobrazí Array
echo $rs['title']; ... zobrazí Lidovky.cz - zpravodajsk� server Lidov�ch novin
echo $rs['items']; ... zobrazí Array
echo $rs['items']; ... zobrazí prázdný řádek
echo $rs['description']; ... zobrazí Aktu�ln� zpravodajstv� z rubrik domov, zahrani��, ekonomika / byznys, sport, bydlen�, auto, Evropsk� unie, v�da. Koment��e.

Nevím jaké jiné parametry zadat pro to pole, aby vyhodilo konkrétní odkaz. Ty bys věděl? Já bych řekla, že v té proměnné $rs ty jednotlivé odkazy nejsou. Ty se zobrazí až pomocí této šablony index.html:

{lastrss_load 
file="http://www.lidovky.cz/export/rss.asp?c=ln_lidovky" 
assign="phpnews"} 
{section name=rss loop=$phpnews.items}
<a href="{$phpnews.items[rss].link}">{$phpnews.items[rss].title}</a><br />
{/section} 


Jinak lastrss.php je to, co jsi poslal v odkaze.

A když po téhle řádce ( $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]); ) zadám echo $out[1]; vyhodí to spoustu keců o daném serveru, ale taky s chybama - tzn. s otazníkama.

Příští rok na Ježíška si budu přát, aby měly všechny servery jedno jasně dané kódování :-)
Stepanka
Profil *
Jo jinak na začátku toho souboru lastrss.php mám definované tyhle proměnné:

var $default_cp = 'UTF-8';
var $CDATA = 'nochange';
var $cp = '';
var $items_limit = 10;
var $stripHTML = False;
var $date_format = '';

Zkoušela jsem dát UTF-8 i do té třetí proměnné $cp, ale efekt žádný..
Stepanka
Profil *
starenka
Jsi moc hodná stařenka, že mi tady tak pomáháš..
starenka
Profil
a vypsala sis jeste ty promenne $this->rsscp a $this->cp ??? az budem vedet co tam je... muzem hodit do cisteho skriptu zkusebni konverzi s temi parametry a zjistit jeslti to neposira ten iconv... (on totiz rad nekdy funguje spatne)

jinak kdyz mas pole a v nem pole je lepisi vypisovat pomoci print_r napriklad takto:

echo '<pre>';
print_r($promenna);
echo '</pre>';
starenka
Profil
jinak mi prosim posli url toho feedu.. zkusim to u sebe... takle je to dost napytel ;))
Stepanka
Profil *
starenka
Proměnné $this->rsscp a $this->cp jsem vypsat samozřejmě zkoušela, ale nic mi to neukazuje. Nevím, jestli je vypisuju správně, když jsou tam ty šipky (->)... Dala jsem prostě echo $this->rsscp; echo $this->cp; a na stránce mi to neukázalo nic navíc. Když dám echo $rsscp; a echp $cp;, taky mi to nic nezobrazí... Vypisuju je nějak špatně?
Stepanka
Profil *
starenka
Jo a mockrát děkuju za tu radu, jak vypsat celé pole. Ani by mě nenapadlo, že to takhle jde :-) Pomohlo mi to zjistit "cestu" k jednotlivým odkazům na zprávy. Je to: for ($i=0; $i<=10; $i++) { echo $rs['items'][$i]['title']."<br>"; } - vypíšou se všechny už v tom php skriptu.. ale samozřejmě zase s otazníkama. Ale děkuju!

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:

0