[PHP/javascript] Encoding problemen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Een form op mjin site wordt bij submitten middels AJAX omgezet in een POST naar de server. Bij het opbouwen van de POST string (urlencoded) gebruik ik encodeURIComponent() om niet in de problemen te komen bij karakters als &= enz.

Helaas zet dit ook accenten nogal lastig om. Zo wordt é omgezet in ï enz. Omdat de teksten in PHP geparsed worden (oa vanwege gebruik prettyurls wil ik de accents verwijderen) wil ik deze encoding omzetten in normale tekens.

Is daar een functie voor die ik niet ken, of hoe pak ik zoiets aan?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Die omzetting lijkt me eerder veroorzaakt worden door het mixen van karakter encoderingen (waaronder UTF-8).

Acties:
  • 0 Henk 'm!

Verwijderd

Gewoon niet character encodings door elkaar halen. Als iets UTF-8 is, moet je het niet als ISO-8859-1 behandelen en andersom. Zorg er gewoon voor dat je overal dezelfde encoding gebruikt, en het hebt dit probleem niet, zéker niet als je de character encoding overal zoveel mogelijk afdwingt.

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Klinkt goed: Echt zo'n hoofdstuk waar ik mij hoopte niet in te hoeven verdiepen..Ik heb in al mijn documenten in de header de charset op UTF-8 gezet. Tevens zorg ik ervoor dat ik al mijn bestanden in UTF8 opsla op de server. Mis ik iets? Doe ik iets fout?

Acties:
  • 0 Henk 'm!

  • Victor
  • Registratie: November 2003
  • Niet online
encodeURIComponent gebruikt altijd UTF-8. Je pagina zal hier dus ook gebruik van moeten maken.
xilent_xage schreef op dinsdag 05 augustus 2008 @ 19:19:
Klinkt goed: Echt zo'n hoofdstuk waar ik mij hoopte niet in te hoeven verdiepen..Ik heb in al mijn documenten in de header de charset op UTF-8 gezet. Tevens zorg ik ervoor dat ik al mijn bestanden in UTF8 opsla op de server. Mis ik iets? Doe ik iets fout?
Je server zal in de Content-Type header ook UTF-8 als karakterset terug moeten geven.

[ Voor 71% gewijzigd door Victor op 05-08-2008 19:23 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
xilent_xage schreef op dinsdag 05 augustus 2008 @ 19:19:
Klinkt goed: Echt zo'n hoofdstuk waar ik mij hoopte niet in te hoeven verdiepen..Ik heb in al mijn documenten in de header de charset op UTF-8 gezet. Tevens zorg ik ervoor dat ik al mijn bestanden in UTF8 opsla op de server. Mis ik iets? Doe ik iets fout?
Ja, als je ï ziet dan heb je ergens niet-UTF-8 gebruikt. Dat is ook logisch: een é is 1 karakter dat in UTF-8 twee bytes inneemt. Zet je het naar een 1-byte-is-1-karakter charset om, dan krijg je dus twee karakters terug.

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Volgens mij werk ik volledig in UTF-8, ziet iemand hier wat ik over het hoofd heb gezien?
  • Contenttype krijgt charset UTF-8 mee
  • In de HTTP-header (die ik overigens niet meestuur bij stukjes HTML die middels AJAX worden geserveerd) heb ik de charset op UTF-8 staan
  • Ik sla mijn bestanden op in UTF-8 encoding
Als ik de check of bijvoorbeeld de ë in een POST-var staat dan krijg ik false, maar als ik deze variabele echo dan zie ik em wel correct staan...

Acties:
  • 0 Henk 'm!

  • Victor
  • Registratie: November 2003
  • Niet online
Probeer die controle eens als volgt:
PHP:
1
strpos($_POST["var"], utf8_encode(chr(0x00eb))) !== false ? "ja" : "nee"

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Geeft "ja". Maar... wat betekent dat?

Acties:
  • 0 Henk 'm!

  • Victor
  • Registratie: November 2003
  • Niet online
Dat betekent dat je dat teken in ieder geval goed binnenkrijgt (sluit dus de verschillende headers uit). Je controleert hier op basis van de Unicode codepoint, waardoor je zeker weet dat je over het Unicode karakter "ë" praat.

Dan kan het toch eigenlijk alleen betekenen dat je je bestanden niet opslaat als UTF-8. Misschien moet je dat nog eens controleren.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
xilent_xage schreef op dinsdag 05 augustus 2008 @ 19:37:
In de HTTP-header (die ik overigens niet meestuur bij stukjes HTML die middels AJAX worden geserveerd) heb ik de charset op UTF-8 staan
Waarom bij AJAX niet? En is het ook AJAX waarbij de problemen optreden?

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
@GlowMouse: Omdat ik dat incorrect vind. AJAX haalt een klein stukje HTML op, bijvoorbeeld een form of divje, die vervolgens aan de DOM wordt toegevoegd. Daarmee krijgt het een plekje in het bestaande document, dat al een header heeft. Edit: Excuus, ik bedoelde hier de HEAD, niet de header.

@Victor: Volgens mij heb je gelijk en zijn een aantal bestanden for some reason met ANSI opgeslagen... bedankt!

[ Voor 7% gewijzigd door xilent_xage op 05-08-2008 21:11 . Reden: header verduidelijkt ]


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
xilent_xage schreef op dinsdag 05 augustus 2008 @ 21:06:
Daarmee krijgt het een plekje in het bestaande document, dat al een header heeft.
Neehee. In 't algemeen: Je moet áltijd van élke string de encoding wéten. En dat zonder hele verre context of aannames.

{signature}


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Mijn fout, ik bedoelde de HEAD, niet de headers, die stuur ik wel altijd mee.

Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
xilent_xage schreef op dinsdag 05 augustus 2008 @ 21:06:
@GlowMouse: Omdat ik dat incorrect vind. AJAX haalt een klein stukje HTML op, bijvoorbeeld een form of divje, die vervolgens aan de DOM wordt toegevoegd. Daarmee krijgt het een plekje in het bestaande document, dat al een header heeft. Edit: Excuus, ik bedoelde hier de HEAD, niet de header.

[..]
Dat maakt dus niet uit. Een AJAX request is weer een nieuwe request, dus je moet weer opnieuw 'afspreken' wat voor encoding je gebruikt.

Je moet AJAX niet zien als manier om je document aan te vullen, maar als manier om dmv javascript met een server te communiceren.

[ Voor 10% gewijzigd door compufreak88 op 05-08-2008 21:14 ]


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

xilent_xage schreef op dinsdag 05 augustus 2008 @ 21:06:
@GlowMouse: Omdat ik dat incorrect vind. AJAX haalt een klein stukje HTML op, bijvoorbeeld een form of divje, die vervolgens aan de DOM wordt toegevoegd. Daarmee krijgt het een plekje in het bestaande document, dat al een header heeft. Edit: Excuus, ik bedoelde hier de HEAD, niet de header.
Zal je het niet, om fouten in de pagina's te voorkomen, ook deze tekst (want dat is het in feite ;)) ook niet als UTF-8 gaan serveren? :)

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Ok, ik twijfel even of dit een cryptische woordgrap over mijn inhoudelijke fout in de post is. Voor alle zekerheid hap ik toch maar even: Ik serveer die stukjes HTML al als UTF-8.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
offtopic:
GJ-tje, heeft na jouw edit op quote gedrukt maar heeft de edit niet opgemerkt, weinig cryptisch aan. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Ok ik kom er zojuist achter dat een heleboel bestanden niet als UTF-8 zijn opgeslagen. Om de ramp even inzichteljik te maken: Mijn framework bestaat uit een paar honder files... Het bestandje wat de POST uitleest is inmiddels wel als UTF-8 opgeslagen, maar blijft nog steeds hetzelfde probleem hebben. Voor dit scriptje wordt uitgevoerd zijn er enkele tientallen andere bestanden geinclude. Begrijp ik het goed dat indien somewhere along the line een bestand wordt aangeroepen dat niet als UTF-8 opgeslagen is, het al misgaat?

En is er een eenvoudige manier om dit te debuggen, zodat ik kan achterhalen welk bestandje het probleem veroorzaakt?

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

xilent_xage schreef op dinsdag 05 augustus 2008 @ 21:17:
Ok, ik twijfel even of dit een cryptische woordgrap over mijn inhoudelijke fout in de post is. Voor alle zekerheid hap ik toch maar even: Ik serveer die stukjes HTML al als UTF-8.
Ik zeg alleen maar dat je de 'nieuwe' content die je door middel van AJAX ophaalt ook moet encoden als UTF-8, net als de andere pagina's... :)

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
@GJ-tje: Dat hoort, dat is normaal... :)

Acties:
  • 0 Henk 'm!

  • Victor
  • Registratie: November 2003
  • Niet online
Zorg dat op z'n minst alle bestanden waarin die vergelijking plaatsvindt, met de juiste karakterset zijn opgeslagen.

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Ik zie t al misgaan in firebug bij de POST variabelen die worden meegestuurd. Of geeft firebug dat altijd zo raar aan? Zoniet: Waar kan het dan nog aan liggen, want alle files moeten nu wel goed zijn en het werkt nog steeds niet...

Acties:
  • 0 Henk 'm!

  • Victor
  • Registratie: November 2003
  • Niet online
xilent_xage schreef op dinsdag 05 augustus 2008 @ 21:52:
Ik zie t al misgaan in firebug bij de POST variabelen die worden meegestuurd. Of geeft firebug dat altijd zo raar aan? Zoniet: Waar kan het dan nog aan liggen, want alle files moeten nu wel goed zijn en het werkt nog steeds niet...
Wat zie je in Firebug dan?

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
edit_page_info_title: Zoëven hè staat er bij de POST variabelen van de request.

terwijl ik toch echt heb ingevoerd: 'Zoëven hè'.

Het lijkt er dus op dat de POST al door js verkeerd wordt doorgegeven? Of kan firebug niet omgaan met UTF-8?

[ Voor 10% gewijzigd door xilent_xage op 05-08-2008 22:11 ]


Acties:
  • 0 Henk 'm!

  • Victor
  • Registratie: November 2003
  • Niet online
Dat is wel vreemd... Misschien dat je de Content-Type header moet zetten op je XMLHttpRequest: application/x-www-form-urlencoded; charset=utf-8

Acties:
  • 0 Henk 'm!

  • xilent_xage
  • Registratie: Februari 2005
  • Laatst online: 15-09 11:35
Goed idee. Alleen het werkt niet. Nu geeft ie in de POST variabelen mee:
Zo%C3%ABven%20h%C3%A8. Weet niet of dat een stap vooruit is of juist achteruit :)

Acties:
  • 0 Henk 'm!

  • Victor
  • Registratie: November 2003
  • Niet online
Dat klopt, dat is het resultaat van URI encoding loslaten op die string. In je PHP code zou dit nu ook goed moeten gaan.

BTW, hier een kleine testcase zodat je kunt controleren of je inderdaad je PHP documenten als UTF-8 opslaat:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
header("Content-Type: text/html; charset=utf-8");

if (isset($_POST["text"]) === true)
{
?>
<pre>
<?php
    echo "Invoer: " . $_POST["text"] . "\n";
    echo "Bevat &#x00eb; (controle op code point): " . (strpos($_POST["text"], utf8_encode(chr(0x00eb))) !== false ? "ja" : "nee") . "\n";
    echo "Bevat &#x00eb; (controle op string literal): " . (strpos($_POST["text"], "ë") !== false ? "ja" : "nee");
?>
</pre>
<?php
}
?>
<form action="test.php" method="post">
    <input type="text" name="text">
    <input type="submit">
</form>

Als na invoer van een "ë" de eerste "ja" zegt en de tweede "nee", weet je dat het bestand geen UTF-8 is. Hier kun je natuurlijk ook met je AJAX code tegenaan testen.

[ Voor 77% gewijzigd door Victor op 05-08-2008 22:33 ]

Pagina: 1