Hallo Gunnar,
die Spec ist da ein bisschen ungenau.
Zum einen schreibt sie, dass ein Dokument mit dem Prolog beginnt und erwähnt nichts von Whitespace.
Zum anderen schreibt sie, dass ein Dokument eine Entity ist und dass eine in UTF-8 codierte Entity mit einem BOM beginnen darf - nicht muss. Eine in UTF-16 codierte Entity muss hingegen mit einem BOM beginnen (§4.3.3).
Das ist dann aber Teil des Encodings und nicht Teil der Entity, insofern ist das BOM nicht in der document Produktion enthalten.
Zum XML-Deklaration schrubst Du noch:
Wenn man keine braucht (bspw. um eine von UTF-8 abweichende Zeichencodierung anzugeben), kann man sie weglassen.
Genauer: um eine von UTF-8 oder UTF-16 abweichende Codierung anzugeben, sofern es keine andere Quelle für diese Information gibt.
§4.3.3:
Although an XML processor is required to read only entities in the UTF-8 and UTF-16 encodings, it is recognized that other encodings are used around the world, and it may be desired for XML processors to read entities that use them. 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 (see 4.3.1 The Text Declaration) containing an encoding declaration:
und "text declaration" ist '<?xml' VersionInfo? EncodingDecl S? '?>'
Ich will jetzt nicht verfechten, dass man die Encoding-Angabe auf Teufelkommraus weglassen sollte. Man weiß ja nie, wann die external character encoding information mal fehlt, deshalb ist es sicherer, sie für Nichtstandardencodings drinzuhaben.
Aber vielleicht verstehe ich diesen Textsalat ja auch miss, Specs wollen hypergenau und redundanzfrei sein, mit der Folge, dass sie write-only werden…
Als Fazit verstehe ich das so:
Ein XML-Dokument in UTF-8
- darf ein BOM haben.
- darf eine XML-Deklaration haben
Ein XML-Dokument in UTF-16
- muss ein BOM haben (vermutlich, um die Endianness unterscheiden zu können)
- darf eine XML-Deklaration haben
Ein XML-Dokument in UTF-32
- wird von der XML 1.0 Spec nicht betrachtet. XML 1.1 spricht es zumindest als eine von mehreren Unicode Encodings an
- muss eine XML-Deklaration haben (weil es nicht UTF-8 oder UTF-16 ist)
- könnte mit einem 32-bit BOM den Parser verwirren, braucht aber eigentlich eins, um die Endianness sicher feststellen zu können. Here be parsons
Ein byteweise codiertes XML-Dokument
- darf und kann kein BOM haben (weil's sonst UTF oder Binärzeugs wäre)
- muss eine XML-Deklaration haben und sollte daher eine auf ASCII basierende Codepage benutzen
Ein EBCDIC codiertes XML-Dokument
- braucht einen Transcodierer oder einen schlauen XML-Parser, weil <?xml in EBCDIC ganz andere Bytes nutzt als in ASCII.
Rolf
--
sumpsi - posui - obstruxi