Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Prism Deppenfrage: Wie sieht UTF-8 aus? (https://www.delphipraxis.net/100673-deppenfrage-wie-sieht-utf-8-aus.html)

alzaimar 2. Okt 2007 11:38


Deppenfrage: Wie sieht UTF-8 aus?
 
Hi

Is mir das peinlich: Ich streite mich grad mit unserem XML/C# Guru. Der meint nämlich, seine XML-Datei sei astreines UTF-8.
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<Object xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Test>äöü
  </Test>
</Object>
Man beachte die Umlaute. Ist das jetzt UTF-8 oder nicht?

stz 2. Okt 2007 11:42

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Das wird dir so keiner beantworten können. Um das zu beurteilen, muss man schon die Original-Datei ansehen. (Wenn der Editor, mit dem du die Datei geöffnet hast, um den Code hier in das Posting zu kopieren, UTF-8 beherrscht hat, dann sieht so UTF-8 aus ;-))

Gruß
Malte

alzaimar 2. Okt 2007 11:45

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Delphi-Quellcode:
procedure TForm1.btClick(Sender: TObject);
Const
  sXML = '<?xml version="1.0" encoding="utf-8"?>'
  +'<Object xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'
  +'<Test>äöü</Test></Object>';
Var
  x : ixmlDocument;

begin
  x := loadxmlData (sXML);
So, und jetzt? :mrgreen:

Das Witzige ist: Der Code funktioniert unter Delphi (Win32) *nicht*, aber unter Delphi.NET schon. :gruebel:

Eigentlich will ich so ein XML-Objekt mal eben einlesen, irgendwo manipulieren und dann wieder zurückliefern. Beim Zurückliefern sind die Umlaute dann aber futsch.

OregonGhost 2. Okt 2007 11:48

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
UTF-8 ist eine Zeichenkodierung, die jegliches Unicode-Zeichen darstellen kann. Im Zweifel kannst du dir die Datei ja mal im Hex-Editor angucken, um zu sehen, ob die Umlaute ASCII-Zeichen sind oder eben etwas anderes. Oder du öffnest die Datei im Firefox und schaltest die Kodierung auf ASCII um. Sind die Umlaute dann plötzlich zwei komische Zeichen, bei UTF-8-Kodierung jedoch Umlaute, dann ist es wohl UTF-8.

Allerdings habe ich es irgendwie dunkel in Erinnerung, dass man Umlaute in XML bei UTF-8-Kodierung escapen musste und "echte" Unicode-Umlaute somit nicht gültiges XML wären. Aber hier kann mich meine Erinnerung trügen.

Edit: Wenn Delphi/Win32 das nicht kann, Delphi/.NET aber schon, dann spricht das schon für Unicode, oder? :)

Flocke 2. Okt 2007 11:56

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Zitat:

Zitat von alzaimar
Das Witzige ist: Der Code funktioniert unter Delphi (Win32) *nicht*, aber unter Delphi.NET schon. :gruebel:

Delphi für Win32 benutzt kein Unicode, unter DotNet ist dies der Standard. Setze mal encoding="iso-8991-1" ein, das sollte gehen.

sakura 2. Okt 2007 11:59

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Einfache Möglichkeit wäre der Weg über die Dateigröße. Die ist dann UTF-8, wenn die Datei genau doppelt so groß ist, wie die Anzahl der Zeichen, die gespeichert werden plus 3 Bytes für den UTF-8 Header. Die drei Bytes werden gerne weggelassen nd das geht i.A. auch.

...:cat:...

alzaimar 2. Okt 2007 12:03

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Hechel... Ihr seit Klasse, Jungs, aber ich will seit 10 Minuten ne Antwort posten und komm nicht dazu... :zwinker: :zwinker:

Wenn ich den Beispielcode ausführe (mit dem Umlaute-XML im CONST, also eigentlich *kein* UTF-8 ), dann liest LoadXMLData die Umlaute trotzdem ein, obwohl Umlaute ja eigentlich nach UTF-8 kodiert sein müssten. Na gut, mir egal, geht ja so. Aber jetzt:

Speichere ich das Objekt mit SaveToXML(MyString) wieder ab, sieht das Ganze so aus:
XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<Object xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Test>äöü</Test>
</Object>
Um das nun wieder per LoadXMLData einzulesen, muss Ich das(den? die?) BOM vorne abschnippeln und (und das kapier ich einfach nicht) den String per UTF8Decode erstmal dekodieren.

So, und das erklär mir mal einer, denn wozu steht denn im XML 'encoding="utf-8"' drin, wenn ich das sowieso per Hand vorher durchführen muss? Dann kann ich das &/$%&-encoding doch gleich weglassen...

Ich dachte, ich kann sowas machen:

Delphi-Quellcode:
x := LoadXMLData (MyXMLString);
x.SaveToXML (sAnotherString);
x1 := LoadXMLData (sAnotherString);
// x und x1 sollen exakt die gleichen Daten enthalten. Stimmt nur nicht.
Mathematisch gesehen, sollte 'SaveToXML' die Umkehrfunktion von 'LoadXMLData' sein.
Das klappt nur nicht, sondern erst, wenn ich mir einen abbreche:
Delphi-Quellcode:
x := LoadXMLData (MyXMLString);
x.SaveToXML (sAnotherString);
// Dekodieren
sAnotherString := UTF8Decode(sAnotherString);
// BOM wegschnippeln
while sAnotherString[1]<>'<' do
  sAnotherString:= copy(sAnotherString, 2, maxint);
x1 := LoadXMLData (sAnotherString);
// x und x1 enthalten exakt die gleichen Daten
Hab ich nun den Denkfehler, oder ist da was faul im Staate Dot.Net /XML ? :gruebel:

Ich hab in meinem jungendlichen Leichtsinn echt gedacht, das XML das alles für mich regelt...

OregonGhost 2. Okt 2007 12:04

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
@sakura:
Der Weg mit der Dateigröße führt nicht wirklich zum Ziel. Habe gerade testweise das Alphabet als UTF-8 gespeichert. Wie erwartet 29 Byte (BOM + 26 Buchstaben). Der Witz von UTF-8 ist ja gerade, dass im Gegensatz zu UTF-16 oder UCS-2 die häufigsten (ASCII-)Zeichen nur ein Byte belegen.

jbg 2. Okt 2007 12:05

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Zitat:

Zitat von sakura
EDie ist dann UTF-8, wenn die Datei genau doppelt so groß ist

Wofür das 8 bei UTF-8 wohl nur stehen mag? :gruebel:

sakura 2. Okt 2007 12:09

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Zitat:

Zitat von jbg
Wofür das 8 bei UTF-8 wohl nur stehen mag? :gruebel:

:wall: :oops: Ich war mal gedanklick wieder auf Unicode aus :wall: Aber das mit den drei Bytes bleibt weiterhin so :mrgreen:

...:cat:...

P.S.: By Unicode (Little-Endian) ist der Header dann widerum nur 2 Bytes :roll:

OregonGhost 2. Okt 2007 12:11

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Oh, bei der Gelegenheit noch etwas zu meinen XML-Erfahrungen mit .NET: Ich musste noch nie irgendwo ein BOM wegschnippeln. Das BOM sagt dem Parser eigentlich, dass die Datei UTF-8-kodiert ist. Das encoding im XML-Header sagt glaube ich, dass das XML auch UTF-8-kodiert ist, und das sind zwei Dinge, die nicht direkt etwas miteinander zu tun haben (nein, frag bitte nicht, warum). Im Normalfall sollte es keine Probleme geben, die Dateien als UTF-8 zu lesen und zu schreiben.

Zitat:

Wenn ich den Beispielcode ausführe (mit dem Umlaute-XML im CONST, also eigentlich *kein* UTF-8 ), dann liest LoadXMLData die Umlaute trotzdem ein, obwohl Umlaute ja eigentlich nach UTF-8 kodiert sein müssten. Na gut, mir egal, geht ja so. Aber jetzt:
Wenn es im Quellcode im const-Bereich steht, ist es doch Unicode, weil die .NET-Compiler Unicode verarbeiten, oder?

alzaimar 2. Okt 2007 12:17

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Zitat:

Zitat von OregonGhost
Ich musste noch nie irgendwo ein BOM wegschnippeln. Das BOM sagt dem Parser eigentlich, dass die Datei UTF-8-kodiert ist. Das encoding im XML-Header sagt glaube ich, dass das XML auch UTF-8-kodiert ist, und das sind zwei Dinge, die nicht direkt etwas miteinander zu tun haben (nein, frag bitte nicht, warum). Im Normalfall sollte es keine Probleme geben, die Dateien als UTF-8 zu lesen und zu schreiben.

Kann ich schon verstehen, denn das BOM würde dem Parser mitteilen, erstmal alles zu dekodieren und das 'encoding=UTF-8' bedeutet, das die Daten UTF-8 kodiert sind...

Nur, wenn ich den BOM nicht wegschnipple, dann ....
Zitat:

Zitat von Das Exception-Fenster
The data at the root level is invalid. Line 1, position 1, Zeile:1


OregonGhost 2. Okt 2007 12:18

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Hmm, konnte man beim XmlReader nicht ein Encoding angeben? Auch automatische Bestimmung oder so?

Bernhard Geyer 2. Okt 2007 12:39

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Liste der Anhänge anzeigen (Anzahl: 4)
Zitat:

Zitat von alzaimar
Nur, wenn ich den BOM nicht wegschnipple, dann ....
Zitat:

Zitat von Das Exception-Fenster
The data at the root level is invalid. Line 1, position 1, Zeile:1


Der BOM gehöhrt ja auch nicht zum XML-Definierten Bereich deiner Datei und ist primär auch nur eine MS-Ausgeburt.
Ein Parser arbeitet ja grundsätzlich erst mal mit Stream. Und die ersten Bytes die er vorgesetzt bekommen muß sind <?xml version="1.0". Wenn Du nun einen BOM in deiner Datei hast so muß entweder dein Parser dies berücksichtigen das hier noch 3 Bytes kommen wenn die Datei mit diversen MS-Tools (Notepad) bearbeitet wurde und sie ignorieren denn nach XML beginnt ja erst mit der coding-Angabe wie die Datei interpretiert werden muss. Und wenn der BOM vorhanden ist müßten die Datei erstmal komplett "ent-utf8" werden um dann den Ergebnisstream dem Parser zu übergeben.

Ich hab mal ein paar Dateien angehängt. Einfach mal z.B. mit IE6/7, Firefox, MS Notepad 2007, ... ausprobieren. Da kann man nur sagen: Danke, Microsoft.

Muetze1 2. Okt 2007 12:41

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
BOM bei UTF-8 ist keine Pflicht. Also nichts mit unbedingt 3 Bytes mehr...

Bernhard Geyer 2. Okt 2007 12:41

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Liste der Anhänge anzeigen (Anzahl: 3)
Noch ein Anhang: Unicode-Codierte speicherung einer UTF8-XML-Datei

[Edit]Noch ein paar Beispiele angehängt[/Edit]

Muetze1 2. Okt 2007 12:43

Re: Deppenfrage: Wie sieht UTF-8 aus?
 
Das ist Unicode bzw. UTF-16 und kein UTF-8 (es steht zwar so im XML Header, aber hier sind es 2 Bytes pro Char-Entry)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz