Re: Expat und XML_SetUnknownEncodingHandler
Manfred Rebentisch <[email protected]>
| Newsgroups | gmane.linux.suse.programming |
|---|---|
| Organization | COMPARAT Software-Entwicklungs-GmbH |
| Message-ID | <[email protected]> |
Hallo David,
einfach ist die Antwort nicht...
Am Mittwoch, 7. Dezember 2005 15:14 schrieb David Haller:
> Hallo,
>
> Am Wed, 07 Dec 2005, Manfred Rebentisch schrieb:
> >Hallo,
> >hat jemand von Euch schon mal XML_SetUnknownEncodingHandler() mit Expat
> >eingesetzt?
> >
> >Ich fand keine Beispiele dazu und finde die Dokumentation zu diesem Punkt
> >ziemlich bescheiden (ich verstehe sie nicht).
>
> Schreibe doch mal, _was_ du nicht verstehst.
siehe unten.
>
> file:///usr/{,/local}/share/doc/packages/expat/reference.html#XML_SetUnknow
>nEncodingHandler
>
> Ansonsten: welche Version(en) der libexpat?
>
rpm-package: expat-1.95.8-2
/usr/lib/libexpat.so.0.5.0
Ich benutze SuSE 9.2
Zunächst melde ich mit
XML_SetUnknownEncodingHandler(xparser, intern_unknownencodinghandler, myObj);
die Funktion intern_unknownencodinghandler() als Handler an.
Dann setze ich für ein XML-Dokument das Encoding auf einen Zeichensatz, der
von expat nicht unterstützt wird:
XML_SetEncoding(xparser, "iso-8859-2");
static int intern_unknownencodinghandler(void* userdata,
const char* name, XML_Encoding* info)
{
printf("info->data: %p, info->convert: %p\n",
info->data, info->convert);
info->data = userdata;
info->convert = intern_convert;
if(1) {
int i;
for(i=0; i < 256; i++) {
printf("%d^", info->map[i]);
}
printf("\n");
}
printf("encoding is supported\n");
return XML_STATUS_OK;
}
Die info-Struktur ist:
typedef struct {
int map[256];
void *data;
int (XMLCALL *convert)(void *data, const char *s);
void (XMLCALL *release)(void *data);
} XML_Encoding;
Beim ersten Aufruf ist data, convert und release NULL. map enthält 256 mal die
"-1".
Laut Doku steht -1 für ein "malformed byte" und: "If the value is -2, -3, or
-4, then the byte is the beginning of a 2, 3, or 4 byte sequence
respectively."
Mir fehlt aber der Bezug. Zum einen weiß ich nicht, warum die Funktion nur
einmal aufgerufen wird, auch wenn ich convert auf eine eigene Funktion setze
und obwohl ich XML_STATUS_OK zurückgebe.
Zum anderen weiß ich nicht, wie das mit der map gemeint ist. Wenn sie sich auf
ein 256-int-Array in data bezieht, muß ich die Werte in map setzen oder
lesen?
Muß ich irgendwas mit convert machen, also eine eigene Funktion einsetzen?
Unter welchen Umständen wird diese aufgerufen?
Wie ist dann der Parameter "s" zu interpretieren?
Ich habe dann info->data so interpretiert, daß man dort einen eigenen Pointer
unterbringen kann, der dann als void*-Pointer mit der convert-Funktion wieder
auftaucht. Habe die convert-Funktion so geschrieben:
static int intern_convert(void* data, const char* s)
{
printf("intern_convert called with <s>: %s\n", s);
return 0xC2A0; /* irgendein Unicode-Zeichen */
}
Der Aufruf von XML_ParseBuffer hat dann zur Folge:
XML_ParseBuffer returns: 18, [unknown encoding] on row=1 and col=0 (index -1)
intern_convert wird garnicht aufgerufen.
Viele Grüße
Manfred
--
Um die Liste abzubestellen, schicken Sie eine Mail an:
[email protected]
Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken
Sie eine Mail an: [email protected]