Thomas Mell: Kodierung von DTD's/Schemata

Hallo,
ich habe mal ein paar Fragen zur Zeichenkodierung von DTD's und Schemata:
1. Muss ein XML-Prozessor, UTF-8 Dokumente welche z. B. eine UTF-16-DTD verwenden möchten, verarbeiten ?
2. Ist es überhaupt erlaubt unterschiedlich kodierte Dokumente/DTD's/Schemata zu verwenden ?
Es währe doch z. B. denkbar das ich eine DTD in ISO-8859-1 erstelle, in Kommentarbereiche Umlaute benutze und diese DTD für ein UTF-8 Dokument verwende.
Oder müssen alle DTD's/Schemata in der gleichen Kodierung erstellt werden wie das Hauptdokument ?
Mir geht es nicht darum was Sinnvoll ist oder nicht, sondern was technisch erlaubt ist.

Viele Grüße
Thomas

  1. Hallo Thomas,

    Laut http://www.w3.org/TR/REC-xml/#charencoding muss ein XML Prozessor mindestens UTF-8 und UTF-16 unterstüzen und jedes "external parsed entity" darf einen anderen Zeichensatz verwenden (den man natürlich auch angeben muss, wenn es sich nicht um UTF-8/16 handelt).

    Schemata sind ganz normale XML-Dokumente, somit gilt da das gleiche.
    Da man ein Schema oder eine DTD üblicherweise für sehr viele Dokumente verwendet, wäre es auch äußerst unpraktisch, wenn man sich dadurch auf eine Zeichencodierung festlegen müsste.

    Grüße

    Daniel

  2. Hallo,

    ich habe mal ein paar Fragen zur Zeichenkodierung von DTD's und Schemata:

    1. Muss ein XML-Prozessor, UTF-8 Dokumente welche z. B. eine UTF-16-DTD verwenden möchten, verarbeiten ?

    Ja. *

    1. Ist es überhaupt erlaubt unterschiedlich kodierte Dokumente/DTD's/Schemata zu verwenden ?

    Ja. **

    Es währe doch z. B. denkbar das ich eine DTD in ISO-8859-1 erstelle, in Kommentarbereiche Umlaute benutze und diese DTD für ein UTF-8 Dokument verwende.

    Ja, ist denkbar. ***

    Oder müssen alle DTD's/Schemata in der gleichen Kodierung erstellt werden wie das Hauptdokument ?

    Nein. ****

    Mir geht es nicht darum was Sinnvoll ist oder nicht, sondern was technisch erlaubt ist.

    * bis ****

    Bei einem XML-Schema ist es klar, da es in XML-Dokument ist, kannst du ja die Kodierung im "encoding" festlegen.
    Bei DTDs ist auch nicht wiel anders, nur wird das in der XML-spec. nicht ganz klar ausgedrück.

    ---------
    http://www.w3.org/TR/REC-xml/#dt-doctype
    The document type declaration can point to an external subset (a special kind of external entity) containing markup declarations
    ---------

    Was hier nicht ausrücklich gesagt wird, aber zutrifft ist, dass die externe DTD-Untermenge eine "external parsed entity" ist.

    Daher gilt eigentlich:
    ----------
    http://www.w3.org/TR/REC-xml/#sec-TextDecl
    External parsed entities SHOULD each begin with a text declaration.
    TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'
    ----------

    Desweiteren gilt dann:
    ----------
    http://www.w3.org/TR/REC-xml/#charencoding
    Each external parsed entity in an XML document MAY use a different encoding for its characters.  [...]

    In the absence of external character encoding information (such as MIME headers), parsed entities which are stored in an encoding other than UTF-8 or UTF-16 MUST begin with a text declaration [...]
    ----------

    Was dann die einzelen Prozessoren unterstützen ist eine andere Frage. [1]

    Grüße
    Thomas

    PS: [1] Nur als Bsp., der MSXML schreitert bei eine DTD (32-bit):
    ----------------------------------------
      þÿ   <   ?   x   m   l       v   e   r   s   i   o   n   =   "   1   .   0   "       e   n   c   o   d   i   n   g   =   "   I   S   O   -   1   0   6   4   6   -   U   C   S   -   4   "   ?   >

    <   !   E   L   E   M   E   N   T       d   a   t   a       (   f   o   o   ,   b   a   r   )   +   >

    <   !   E   L   E   M   E   N   T       f   o   o       (   #   P   C   D   A   T   A   )   >

    <   !   E   L   E   M   E   N   T       b   a   r       (   #   P   C   D   A   T   A   )   >

    ----------------------------------------

    Schlciht, weil er das nicht unterstützt.
    16-bit: <?xml version="1.0" encoding="ISO-10646-UCS-2"?> oder
    <?xml version="1.0" encoding="UTF-16"?> (Big- oder Little-Endian) dagegen machen ihm in einer DTD nichts aus.