DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   Sva početnička pitanja (http://www.devprotalk.com/forumdisplay.php?f=40)
-   -   Encoding XMLa na WordPressu (http://www.devprotalk.com/showthread.php?t=6584)

blogowski 30. 10. 2008. 14:24

Encoding XMLa na WordPressu
 
Situacija sledeca, prosle godine selim blog (wordpress) sa sharing hostinga na dedicated, sve funkcionise bez problema. Pre par meseci, gasim dedicated i vracam se na isti sharing hosting i problemi sa xml RSSa pocinju.

Naime, RSS feed koji izlazi sa feedurnera ima problem sa encoding. Kada moj inicijalni feed ubacim u neki RSS reader sve je OK, kada isto uradim sa feedom iz Feedburnera, haos sa nasim karakterima.

Kada odem na panel Feedburnera na Troubleshootize, javlja mi gresku:

Citat:

The URL you entered does not appear to be a valid feed. We encountered the following problem: Error on line 317: Invalid byte 2 of 2-byte UTF-8 sequence.
Ocigledno mi je da je problem sa encodingom, ali evo vec dva dana pokusavam sve i svasta i nemam resenje. Napominjem da nema nikakvih problema sa encodingom na samom blogu nego iskljucivo na XMLu i to Feddburnerovom. Takodje, uradio sam update na poslednju verziju Wpa i sve je proslo OK, ali feed je i dalje neispravan :/

Evo code iz /wp_includes/feed-rss2.php (kako mi je po defaultu RSS2) koji pretpostavljam da pravi problem

PHP kôd:

<?php
/**
 * RSS2 Feed Template for displaying RSS2 Posts feed.
 *
 * @package WordPress
 */

header('Content-Type: text/xml; charset=' get_option('blog_charset'), true);
$more 1;
?>
<?php 
echo '<?xml version="1.0" encoding="' .get_option('blog_charset'). '"?'.'>'?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    <?php do_action('rss2_ns'); ?>
>

pokusavao sam i da na «*tvrdo*» ubacim
PHP kôd:

<?xml version="1.0" encoding="utf-8"?>

ali onda mi ne radi ni inicijalni feed :(

Interesantno mi je sto kada odem na validator W3C Feed i checkiram url inicijalnog feeda, javlja mi gresku. Kada pak uzmem code source mog generisanog xmla i checkiram ga direktnim unosom na validator kaze mi da je xml ispravan !! WTF??!!

Unapred tnx.

p.s.
Mislim da je pitanje pocetnicko pa sam ga smestio ovde, ukoliko neko od admina misli da treba da ide na drugo mesto.. ;)

DejanVesic 30. 10. 2008. 14:37

Hm, meni je ovo prošlo:

http://feedvalidator.org/check.cgi?u...om%2FBlogowski

Ima sitnih upozorenja, ali samo to?

blogowski 30. 10. 2008. 14:39

Da, zaboravio da kazem da kada provuces feedurnerov XML, kaze da je OK :D

Totalno strange :/

DejanVesic 30. 10. 2008. 14:55

Kada pustim validaciju osnovnog feed-a:

http://feedvalidator.org/check.cgi?u...2Ffeed%2F#l318

prijavljuje problem sa našim slovima, tačnije velikim Š

Ovo izgleda kao problem u bazi - odnosno, da naša slova nisu lepo upisana u bazu.

Ako i proveriš post na koji se žali:

http://www.blogowski.eu/2008/04/02/macbook-air-hacknut/

videćeš ipak da nije baš sve u redu :-)

Izgleda se u migraciji nešto malo pokršilo za starije postove.

blogowski 30. 10. 2008. 15:04

Da, primetio sam to sa velikim slovom Š kada sam migrirao, pokusao da resim i nisam uspeo. Kapiram da je do baze (mozda i isti uzrok), ali ne nalazim izlas jebiga..

Vec razmisljam da ga skinem sa feedburnera tj. da feedburner preusmerim ka inicijalnom feedu i voilŕ..:1041:

DejanVesic 30. 10. 2008. 17:05

Nije samo veliko Š problem, problem je nevalidan izlaz iz baze - rešavaš problem na pogrešnoj strani ("zašto mi je feed nevalidan kada imam loše kodirane karaktere u bazi").

Tebi inicijalni feed ne valja, dok Feedburner markira problematične karatktere.

Uostalom, provuci oba feed-a (Feedburner, inicijalni) kroz http://feedvalidator.org/ pa izvedi zaključke :)

zsteva 30. 10. 2008. 17:28

Ima osim tog SH ima josh jedna kombinacija. Kad se iz http://www.blogowski.eu/feed/ ukloni to, dobije se validan fajl koji kroz feedburner izgleda ovako:

http://feeds.feedburner.com/BlogWS1111

scripta za fix ovoga:

<?php

$buf = file_get_contents("blogowski-feed.xml");

$buf = str_replace("\xc5\x20","Š", $buf);
$buf = str_replace("\xc3\x20","", $buf);

file_put_contents("blogowski-feed-2.xml", $buf);


\xc3\x20 nemam pojma shta bi moglo da bude neki apostrof ili tako neshto...

probaj export baza, pa kroz ovu scriptu pa import...

:1094:

blogowski 30. 10. 2008. 17:37

Citat:

probaj export baza, pa kroz ovu scriptu pa import...
Kako mislis kroz ovu skriptu? Sta da radim sa rtim? :) Mislis da stavim to parce u XML? Ne kapiram..

MorenoArdohain 30. 10. 2008. 17:41

Dumpujes bazu u text fajl i prepravi zstevin primer da ucitava taj fajl, zatim import izmenjenog fajla (preporucujem u drugu bazu i switchovanje konfiguracije na tu drugu bazu, kako bi bio siguran da to radi). Budi siguran da je sve UTF-8 (baza, konekcija ka bazi).

zsteva 30. 10. 2008. 18:51

Još jedno zanimljivo rešenje, nisam doduše uspeo na brzaka da nadjem nešto slično što bi moglo kao workaround da se stavi u generator rss feeda i da fixne problem, ali mislim da bi ovo isto rešilo problem sa bazom. Naravno export i import mogu da naprave stvari još gorima, jer mysql ima encoding u bazi, encoding na klientu (linku) i on ume da konvertuje izmedju :)))

Fix za invalid utf-8 karaktere uz pomoć iconv-a:

cat blogowski-feed.xml | iconv -c -f UTF-8 -t UTF-8 - > blogowski-feed-2.xml

(dakle umesto blogowski-feed.xml i -2 stavi ulazni dump i izlazni fajl, pa probaj u novu mysql bazu da ubaciš da vidiš da li postoji problem.)

PS: ovo neće srediti slovo Š :(

blogowski 30. 10. 2008. 18:56

Dumpovao bazu preko stevinog fajla, obrisao prethodnu bazu i importovao provucenu bazu. Defintivno ne radi, je** sam mu kevu :1014:

MorenoArdohain 30. 10. 2008. 19:00

U najgorem slucaju, mozes skinuti taj dump u neki txt editor koji podrzava UTF-8, i izmeniti sve problematicne karaktere, i naravno, snimiti opet kao utf-8.

Zatim importovati u bazu. Ako i pored toga ima problema, onda se nesto pogresno radi.

blogowski 30. 10. 2008. 19:08

Pazi, OK i da idem pesaka i sve odradim, fora je sto sledeci post koji objavim bice opet sjeban, ne?

MorenoArdohain 30. 10. 2008. 19:13

Ja razumeo da je to problem sa starim postovima samo, tj feedovima za te starije postove.
Ukoliko se javlja problem i sa novim, onda imas problem na relaciji WP <-> baza.

Ko sto rekoh, proveri da li su baza, tabele i polja u UTF-8.

U svakom slucaju bi morao da popravis i te starije postove.

blogowski 30. 10. 2008. 19:25

Baza je u UTF-8, ali postoje polja koja su u latin1_swedish_ci (a i koja su u UTF-8). E sad ima jos jedan totalno wired momenat, komentari su totalno OK. Naime imam poseban feed na feedburneru i tu je sve OK :)

OK, pretpostavljam da nije potrebno da su sva polja na UTF-8, da li neko zna koja polja u kojoj tablici mogu da prouzrokuju prethodnu boljku? :) Ili da ih menjam sve??

MorenoArdohain 30. 10. 2008. 19:28

Mislim da bi ti bilo lakse da sva polja stavis u UTF-8.

Btw, proveri koji je tip polja za textove komentara, kladim se da su UTF-8 :)

blogowski 30. 10. 2008. 19:34

screenshot DB za postovi / komentari

MorenoArdohain 30. 10. 2008. 19:46

Hm, post_content polje ti je unicode, dok je comment_content polje latin1.

Posto nisam bas WP guru, ja bih ti preporucio sledece:
napravi novu test instalaciju WP-a na serveru (u neki dir), on bi trebao da ti kreira ispravnu bazu, i zatim u nju importuj ispravljen dump iz prethodnih postova. I vidi da li je tu ispravan prikaz.
Ako jeste, onda da izbrises staru WP instalaciju i napravis novu, i importuj isti fajl. Mislim da ti je to najelegantnije resenje.

DejanVesic 30. 10. 2008. 20:28

Možda je ovo bezbolnije:

- napravi testni tekst koji ima sva naša slova: čćšžđČĆŽŠĐ
- proveri da li se u oba feed-a (inicijalni / FeedBurnder) vidi kako treba
- ako se vidi, sledeći korak je da se uradi replace u bazi (iz phpMyAdmin-a) u tekstu "loše upisanih" naših slova sa kodovima naših slova iz ovog dobrog teksta

Kôd:

Update wp_posts SET post_contetnt = replace(post_content, los_kod, dobar_kod) where ima_losih_kodova

MorenoArdohain 30. 10. 2008. 20:32

^ To ne resava problem sa novim postovima koje bude ubacivao.

blogowski 30. 10. 2008. 20:58

Jebem li ga... U lokalu napravio svezu instalaciju. Uvesao tablice samo za komentare, postove, kategorije. Cak i tablicu wp_option nisam uvezao neko rucno nastelovao. Posle sve lepo izvezao on line.. i ne jebe.. :/

Pre toga sam proterao te sve tablice kroz onu skripticu i nista. Za svaki slucaj da proverim i da li novi postovi nece kojim slucajem da se OK ponasaju, objavio jedan post sa nasim slovima, sacekao koji min. da ga feedburner "prevari" i bljuje mi opet sranja. Naravno kada checkujem XML na validator javlja iste one greske :(

Nemam pojma, nisam pametan...

MorenoArdohain 30. 10. 2008. 21:04

Probaj direktno na serveru da napravis, ne u lokalu pa na server.

blogowski 30. 10. 2008. 21:50

Ma kakvi, ne je** me 3%

Sve rucno uradio na serveru, ma kakvi... :( Opet probao objavljivanje novog posta i opet ista stvar. Mislim da cu da napusim feedburner i prebacim se na svoj feed. Jebi ga, znam da nije neko resenje, ali ne znam sta drugo da radim osim da idem post po post da ubacujem rucno na svezi instal (500 postova), a onda sve isto sa komentima (preko 2k) :D

blogowski 30. 10. 2008. 22:11

Baza je ocigledno pukla, sada checkujem opet na validatoru i vidim da ima samo par postova koji nisu encodirani, ono sto ne kapiram sto nove postove mi sjebe ??

zsteva 30. 10. 2008. 22:35

Dva workarounda za problem:

Kôd:

<?php

$buf = file_get_contents("http://www.blogowski.eu/feed/");
$buf = str_replace("\xc5\x20","Š", $buf);
$buf = str_replace("\xc3\x20","", $buf);

print $buf;

i malo univerzalnije reshenje, koje ce sigurno da pokrpi sve invalid UTF8:

Kôd:

#!/bin/bash

echo "Content-Type: text/html; charset=UTF-8"
echo

wget -O- http://www.blogowski.eu/feed/ 2> /dev/null | iconv -c -f UTF-8 -t UTF-8

Oba proverena sa feedburnerom rade ;)

blogowski 30. 10. 2008. 23:13

Steva ga opravi, sada jos da da resenje celo ovde pa da stavimo reseno :)

Usput, pored Steve hvala i Morenu, Dejanu i ostalima ;)

ivanhoe 30. 10. 2008. 23:37

hehe, pogodio sam ko je autor ovog koda sa iconv i pre nego sto sam procitao ime :P

inace, just for the record, zsteva se u stvari zove Zeljko :)

blogowski 30. 10. 2008. 23:54

Ma znam, addict sam facebooka, mozda gori i od Eniaca :D Nego to zbog pseuda (valjda se ne ljuti? :1050: )

zsteva 31. 10. 2008. 07:17

@ivanhue Hvala kolega, biće danas (nadam se) isto to ali iz ob handlera ;)

zsteva zato što je steva već bilo zauzeto (pre mnogo godina), zsteva je poprilično unique na netu, tako da google:zsteva manje više sve referencira na mene :)

Naravno Steva ili Željko, po potrebi i Zoran, pošto ljudi znaju da je zsteva od nešto Stevanović, pa kao šta bi Z moglo da bude ? Pa Zoran naravno :)

Djuki 31. 10. 2008. 12:17

Malo kasno za Peđu ali možda će koristiti ostalima. I ja sam imao isto problem na jednom od blogova, pa evo kako sam to rešio.


Funkcija koja konvertuje sve atribute u svim tabelama u bazi u UTF-8;
Citat:

$sql = 'SHOW TABLES';
if ( !( $result = mysql_query( $sql ) ) ) {
echo '<span style="color: red;">Get SHOW TABLE - SQL Error: <br>' . "</span>\n";
}


while ( $tables = mysql_fetch_array($result) ) {
echo $tables[0];
# Loop through all tables in this database
$table = $tables[key($tables)];
/*$sql_alter = ("ALTER TABLE ". $table ." COLLATE utf8_general_ci");
if ( !( $result2 = mysql_query($sql_alter) ) ) {
echo '<span style="color: red;">UTF SET - SQL Error: <br>' . "</span>\n".$sql_alter;

break;
}

print "$table changed to UTF-8 successfully.<br>\n";*/

# Now loop through all the fields within this table
$sql_column = "SHOW COLUMNS FROM ".$table;
if ( !($result2 = mysql_query($sql_column) ) ) {
echo '<span style="color: red;">Get Table Columns Query - SQL Error: <br>' . "</span>\n".$sql_column;

break;
}
$sql_pk = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.STATISTICS
WHERE INDEX_NAME='PRIMARY'

AND TABLE_NAME='" . $table ."'";
if ($respk = mysql_query($sql_pk)) echo "sql dobar";
$setpk= mysql_fetch_array($respk);
echo "set: ".$setpk[0];
//print_r($setpk);

while ( $column = mysql_fetch_array( $result2 ) )
{
$field_name = $column['Field'];
$field_type = $column['Type'];

# Change text based fields
$skipped_field_types = array('char', 'text', 'enum', 'set');

foreach ( $skipped_field_types as $type )
{
if ( strpos($field_type, $type) !== false )
{
/*$sql4 = "ALTER TABLE $table CHANGE `$field_name` `$field_name` $field_type CHARACTER SET utf8 COLLATE utf8_bin";
$result4 = mysql_query($sql4);

echo "---- $field_name changed to UTF-8 successfully.<br>\n".$sql4;*/
//echo $field_name. "<br>";
$sql_get = "SELECT " .$setpk[0]. "," .$field_name ." FROM ".$table;
$res_get = mysql_query($sql_get);
while ($set = mysql_fetch_array($res_get)) {
$update = "UPDATE ".$table." SET ".$field_name."='".iconv('UTF-8', 'windows-1250', $set[1])."'
WHERE " .$setpk[0] ."=".$set[0].";";
//echo"<br>".$update."<br>";
if (mysql_query($update)) echo "Izmenjen<br>";
else "nije izmenjen<br>";
}
}
}
}
echo "<hr>\n";
}


Vreme je GMT +2. Trenutno vreme je 10:01.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.