ugrás a tartalomhoz

ű és ő karakterek kódolása és továbbítása hálózaton

Jazoja · 2011. Szep. 15. (Cs), 23.02
Van egy WP plugin, amit már nem fejlesztenek, így a készítő se foglalkozik a problémámmal.

A hiba csak az őŐűŰ karaktereket érinti.

Kliens oldalon a következő karaktereket adom be:
ÁáÉéÍíÓóÖöŐőÜüŰű
jQuery .val()-al kiveszi az értéket majd egy escape() után jQuery.post()-al az egész tömböt elküldi.

A karaktersorozat ekkor már így néz ki: (FireBug szerint)
post application/x-www-form-urlencoded:
%C1%E1%C9%E9%CD%ED%D3%F3%D6%F6%u0150%u0151%DC%FC%u0170%u0171
A szerver oldalon PHP $_POST-al leveszi, majd ezzel a két fgv-el kikódolja:
urldecode()
htmlentities()

Ezután több függvényen, osztályon, felületen áthaladva végül előkészíti a mentésre:
serialize()
addslashes()

Ami az adatbázisban már így néz ki.
ÁáÉéÍíÓóÖö%u0150%u0151Üü%u0170%u0171
Betöltéskor visszakódolja:
stripslashes()
unserialize()

Majd átalakítja az újsor karaktereket html sortörésre:
nl2br()

A tömböt json formátumra alakítja.
array_to_json()

Majd két script tag közt egy jQuery fgv-nek átadva visszaküldi a kliensnek.
echo <script>jQuery(selector).imgNotes(json,...)</script>

Itt nemtom merre tovább, de a képernyőn végül ez jelenik meg:
ÁáÉéÍíÓóÖö%u0150%u0151Üü%u0170%u0171
Mint látható, csak az őŐűŰ karakterekkel van gond.

A WP admin felületen a FireFox szerint UTF8 kódolás van.
A
get_option('blog_charset');

szerint a WP karakterkészlet is UTF8
Az adatbázis utf8_general_ci (de utf8_hungarian_ci-vel se láttam különbséget)
Ékezetes karaktereket közvetlenül beleírva gond nélkül eltárol.

Ekkor kipróbáltam, hogy a WP egyáltalán mit kezd az ékezetes karakterekkel.
Ha az admin felületen mentem el az eredeti karaktersorozatot, akkor az így kerül tárolásra az adatbázisban:
&Aacute;&aacute;&Eacute;&eacute;&Iacute;&iacute;&Oacute;&oacute;&Ouml;&ouml;Őő&Uuml;&uuml;Űű
Véleményem szerint a következő fgv-ekkel kéne valamit csinálni.
escape()
urldecode()
htmlentities()

Másik leírásokból kiindulva:
escape() helyett próbáltam encodeURI()-t, ekkor FireBug szerint ezt küldi a szervernek:
%C3%81%C3%A1%C3%89%C3%A9%C3%8D%C3%AD%C3%93%C3%B3%C3%96%C3%B6%C5%90%C5%91%C3%9C%C3%BC%C5%B0%C5%B1
htmlentities() helyett próbáltam htmlspecialchars()-ot
kísérleteztem decodeURI(), decodeURIComponent(), encodeURI(), encodeURIComponent() fgv-ekkel is

Mindenféle ötletet szívesen veszek.
 
1

UTF-8

janoszen · 2011. Szep. 15. (Cs), 23.51
Ha _mindenhol_ UTF-8-at használsz, akkor működni fog. De ehhez az kell, hogy a fejlécek, az adatbázis (kapcsolat) karakterkódolás, sőt még a htmlspecialchars() paraméterezése is stimmeljen. JavaScriptből az encodeURIComponent lesz a megfelelő.
4

siker

Jazoja · 2011. Szep. 18. (V), 16.31
Köszönöm, a két kapott hozzászólásból sikerült megoldani.

JavaScript oldalon az escape helyett használtam az általad említett encodeURIComponent fgv.-t, PHP oldalon meg csak egy urldecode kell. (htmlentities-re nincs szükség)
A kód többi részén nem kellett változtatnom.
2

A jelzett karaktereknek eleve

pp · 2011. Szep. 16. (P), 10.24
A jelzett karaktereknek eleve más a kódolása. Tehát rosszul jön meg.

A htmlentities() függvényre mi szükség van?

adatbázisba írás előtt minek az addslashes()? Milyen adatbázist használsz?

pp
3

más plugin

Jazoja · 2011. Szep. 18. (V), 16.26
Mint említettem, a plugint nem én fejlesztettem, így nem teljesen tudom mit miért csináltak benne.
adatbázis:
WinXP/XAMPP, minden UTF8