[PHP/XML] Probleem met illegal characters in XML

Pagina: 1
Acties:
  • 195 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
Ik ben begonnen om 1 van mijn applicaties in PHP om te bouwen zodat hij AJAX ondersteund, maar ik zit met een probleem.

Het probleem is namelijk dat ik een aantal teksten wil stoppen in een tag, maar deze teksten bevatten rare characters.

Voorbeeldje :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<message_list>
  <message id="1676">
    <subject><![CDATA[[php/xml]Jeff Works Great]]></subject>
    <datetime>06:58</datetime>
    <status>1</status>
  </message>
  <message id="1674">
    <subject><![CDATA[[php/xml]Take advantage of special discounts now guys!]]></subject>
    <datetime>01:59</datetime>
    <status>1</status>
  </message>
  <message id="1675">
    <subject><![CDATA[[php/xml]Nieuw op SchoolBANK]]></subject>
    <datetime>01:42</datetime>
    <status>0</status>
  </message>
  <message id="1673">
  <subject><![CDATA[[php/xml]=?iso-8859-1?Q?Leuke_fotocadeau_idee=EBn_voor_de_feestdagen?=]]></subject>
    <datetime>Nov 26</datetime>
    <status>1</status>
  </message>
</message_list>
Bij deze items gaat het allemaal nog goed, totdat het volgende item komt

code:
1
2
3
4
5
<message id="1664">
    <subject><![CDATA[[php/xml]$BL5NA?7HVAH!J=w@-;o@kEA3HBgCf!K(B]]></subject>
    <datetime>Nov 24</datetime>
    <status>0</status>
  </message>
Bij dit item loopt hij dus vast op het subject, welke van die mooie vierkantjes vertoond. Ik wil ze er eigenlijk niet uitfilteren, want dat zou ik zonde vinden.

Ik heb al verschillende methoden geprobeerd :

* veranderen van encoding
* wel of geen CDATA van maken
* text encoden, maar om het te decoden heb je allemaal weer extra JS scriptjes nodig, wat ik niet wil.

Weet iemand hoe hier mee om te gaan ? Ik heb ook al verschillende searches gedaan op google en hiero, maar de oplossingen daar aangegeven lossen mijn probleem niet op

Edit : Het blijkt ook dat wat bij mij vierkantjes zijn, bij Andre pijltjes zijn :D, dat moet verwarrend zijn.

[ Voor 17% gewijzigd door sorted.bits op 27-11-2005 13:36 ]


Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

Zet je volgende zaken allemaal op UTF-8: je database, je server headers, je php headers, je editor en alle zaken waarmee deze bestanden gemaakt worden. Zolang je in alles maar met UTF-8 werkt is er geen probleem en werkt het perfect.

Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
André schreef op zondag 27 november 2005 @ 13:20:
Zet je volgende zaken allemaal op UTF-8: je database, je server headers, je php headers, je editor en alle zaken waarmee deze bestanden gemaakt worden. Zolang je in alles maar met UTF-8 werkt is er geen probleem en werkt het perfect.
Deze files worden gemaakt in PHP en de XML file bevat de volgende encoding :

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

Voor de rest weet ik niet zo goed wat ik moet doen, de database staat ook goed, maar mijn server headers heb ik geen idee van.

Misschien dat je wat meer uitleg kan geven ?

[ Voor 76% gewijzigd door sorted.bits op 27-11-2005 13:27 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

[google=header http encoding utf-8]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
-NMe- schreef op zondag 27 november 2005 @ 13:36:
[google=header http encoding utf-8]
Ok, heb wat opties getest, maar ook dat lijkt niet te werken, misschien is het een optie om alle rare tekens te converteren naar hun unicode equivalent, MAAR volgens mij gaat dat een resource intensief klusje worden.

Met deze kleine subjects werkt dat nog wel, maar er komen straks ook grotere stukken tekst in.

Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
Ok, ik doe nu gewoon een :

PHP:
1
urlencode(utf8_encode($subject));
en dat werkt gewoon :D

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

sorted.bits schreef op zondag 27 november 2005 @ 13:52:
Ok, ik doe nu gewoon een :

PHP:
1
urlencode(utf8_encode($subject));
en dat werkt gewoon :D
Dat is geen oplossing maar een ranzige workaround.
utf8_encode gaat er van uit dat de utf8 geencodeerde data enkel karakters bevat die in ISO-8859-1 voorkomen - is dat het geval?
en urlencode is voor... url's, niet voor data; niet alle XML applicaties doen automagisch url-decoding van de data.

Waar bij jou waarschijnlijk het probleem ligt is in de content-type header die door je webserver wordt gestuurd; die zal ws een charset=ISO-8859-1 bevatten, en aangezien HTTP headers voorgaan op http-equiv in meta-tags en de encoding property in de xml-declaratie gaat het fout.

Zorg dus dat je php-script gewoon zelf een content-type header stuurt:
PHP:
1
header('Content-Type: text/xml; charset=UTF-8');

en sla je php-script zelf ook UTF8-encoded op.

Verder hoef je bij het gebruik van CDATA-tags verder geen encoding te doen of entities te gebruiken. Data buiten CDATA-tags daarvan dien je uiteraard wel de speciale karakters &lt, >, & en " om te zetten naar entities (en geen HTML-entities - het is geen HTML maar XML - maar de numerieke entities).

Komen we nog wel op een belangrijk puntje aan: uiteraard dient de pagina die deze data via Ajax gaat verwerken zelf ook UTF8 geencodeerd te zijn ;)

offtopic:
overigens is dit een heel algemeen probleem bij oa. RSS-feeds en XML; het merendeel van alle feeds zijn in feite invalid omdat de xml-declaratie een andere charset opgeeft dan daadwerkelijk door de HTTP headers wordt gedicteerd.

[ Voor 14% gewijzigd door crisp op 27-11-2005 14:37 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
Wat jij beschrijft heb ik allemaal geprobeerd en dat werkt dus niet op 1 of andere manier :(.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Waar komen die teksten eigenlijk vandaan?
Zoals ik het nu bekijk lijkt het wel alsof je die weer uit andere externe bronnen vandaan haalt en in je database stopt, en dat je database wellicht gewoon ISO-8859-1 is maar sommige data (niet alles) UTF-8.
Dan zou je het probleem dus bij de bron moeten aanpakken en alles op dezelfde manier gecodeerd moeten opslaan.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
De teksten komen vanuit mijn mailbox, het zijn subjects van emailtjes die binnen zijn gekomen in mijn POP box.

De teksten kan ik dus niet beinvloeden en dit zijn ook exact de teksten zoals in de mailtjes. Er kan dus nooit vanuit gegaan worden dat de teksten geschikt zijn om in XML te verwerken.

Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
ik schoon mijn invoer (ook niet 100% gegarandeerd geldig utf8) op de volgende manier op :

PHP:
1
$tmp['xml'] = iconv("UTF-8","UTF-8//IGNORE",$tmp['xml']);


de //IGNORE zorgt ervoor dat ongeldige karakters gewoon overgeslagen worden. je hebt (uiteraard) wel de iconv-extensie nodig.

Acties:
  • 0 Henk 'm!

  • maartenba
  • Registratie: November 2001
  • Laatst online: 29-07-2024
Heb gisteren hetzelfde probleem gehad. Een (vuile) workaround gedaan door htmlentities() eromheen te gooien, totdat ik een goeie oplossing vind.
De voorgestelde oplossingen met headers in UTF-8 op alle mogelijke plaatsen lukt helaas ook niet.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

maartenba schreef op dinsdag 29 november 2005 @ 09:22:
Heb gisteren hetzelfde probleem gehad. Een (vuile) workaround gedaan door htmlentities() eromheen te gooien, totdat ik een goeie oplossing vind.
De voorgestelde oplossingen met headers in UTF-8 op alle mogelijke plaatsen lukt helaas ook niet.
htmlentities zijn niet bedoelt voor XML; in het beste geval zal een XML applicatie ze negeren of letterlijk laten zien. Buiten de entities voor <, >, " en & zijn er geen entiteiten gedefinieerd voor XML.

Verder begint het gebruik van UTF8 al bij je input; dat dien je indien nodig om te zetten naar UTF8 en ook zodanig op te slaan (je DBMS moet dus ook UTF8 ondersteunen).

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
Probleem is dus (zoals al is uitgelegt), de input krijg ik binnen in verschillende formaten, dit omdat het uit een mailbox komt.

Hoe kan ik er dan voor zorgen dat ik dat om kan zetten naar UTF8? Ook ben ik wel benieuwd hoe ik mijn DB UTF8 kan maken (het gaat om een MySQL database, maar ik kan die optie niet echt vinden.

Acties:
  • 0 Henk 'm!

  • mr_star
  • Registratie: Maart 2003
  • Laatst online: 16-05 13:15
die vierkantjes geven trouwens hier op GOT ook problemen als je de XML van dit topic wilt bekijken. Ik heb bij mijn applicatie hetzelfde probleem. Alle headers staan goed, alle velden in de database zijn UTF-8 en de browser geeft aan dat de pagina UTF-8 encoded is. Het serverside parsen van de XML met XSL is geen probleem, maar van de moment dat ik in mijn browser de XML wil zien met van die vierkantjes krijg ik een parser error.

@crisp: je zegt dat je de input indien nodig moet omzetten naar UTF-8. Dat lijkt mij ook heel logisch, want de gebruiker kan tekens ingeven die niet gekend zijn in UTF-8. Maar je zegt dat dit niet kan met de functie utf8_encode. Op welke manier wordt dit dan normaal gedaan? Ik heb hier in het verleden al achter gezocht maar tot nu toe heb ik hier nog niets voor gevonden.
sorted.bits schreef op woensdag 30 november 2005 @ 23:16:
Hoe kan ik er dan voor zorgen dat ik dat om kan zetten naar UTF8? Ook ben ik wel benieuwd hoe ik mijn DB UTF8 kan maken (het gaat om een MySQL database, maar ik kan die optie niet echt vinden.
Vanaf versie mysql versie 4.1 kan dit met: http://dev.mysql.com/doc/refman/4.1/en/charset-column.html (phpmyadmin ondersteunt dit ook gewoon)

[ Voor 22% gewijzigd door mr_star op 01-12-2005 00:55 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

mr_star schreef op donderdag 01 december 2005 @ 00:49:
die vierkantjes geven trouwens hier op GOT ook problemen als je de XML van dit topic wilt bekijken. Ik heb bij mijn applicatie hetzelfde probleem. Alle headers staan goed, alle velden in de database zijn UTF-8 en de browser geeft aan dat de pagina UTF-8 encoded is. Het serverside parsen van de XML met XSL is geen probleem, maar van de moment dat ik in mijn browser de XML wil zien met van die vierkantjes krijg ik een parser error.
De GoT XML is niet UTF-8 maar ISO-8859-15. Het komt echter nog al eens voor dat er karakters gepost worden die niet gedefinieerd zijn in ISO-8859-15. In principe zou de XML-parser die of moeten omzetten naar een geldige entity, of compleet moeten strippen. Helaas is de React XML-parser nog niet zo strict...
@crisp: je zegt dat je de input indien nodig moet omzetten naar UTF-8. Dat lijkt mij ook heel logisch, want de gebruiker kan tekens ingeven die niet gekend zijn in UTF-8. Maar je zegt dat dit niet kan met de functie utf8_encode. Op welke manier wordt dit dan normaal gedaan? Ik heb hier in het verleden al achter gezocht maar tot nu toe heb ik hier nog niets voor gevonden.
Nee, het mooie van UTF-8 is juist dat daarin elk karakter gedefinieerd is. Andersom kan je een UTF-8 string dus niet rucksightloss omzetten naar ISO-8859-xx aangezien die beperkt is qua karakters.

Het eerste wat je moet doen, als je met UTF-8 wilt werken, is van je input bepalen welke karakterset gebruikt is. utf8_encode gaat echter enkel uit van ISO-8859-1 input. Als je input bijvoorbeeld ISO-8859-15 of ANSI of CP1252 is kan utf8_encode verkeerde resultaten geven...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • sorted.bits
  • Registratie: Januari 2000
  • Laatst online: 21:03
ok, nou de characterset kan ik achterhalen aangezien die gedefinieerd wordt in de header van een mailtje. Maar wanneer ik daan een encode probeer, krijg ik alsnog dezelfde zooi (net of er weinig mee gebeurt).

Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
die 'blokjes' zie ik hier gewoon als een onbekende glyph met daarin de character-code, in dit geval 001B, wat de utf8-code is voor een escape-character. probleem is dat dit character geldig utf8 is, maar _niet_ geldig is in een xml-document. het 'opschonen' van invoer naar geldig utf8 is in dit geval dus niet voldoende, je zult ook nog eens de in xml niet toegestane characters eruit moeten filteren. een goede manier om dit makkelijk in php te doen heb ik zelf ook niet, iemand anders misschien ?
Pagina: 1