![]() |
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:
Man beachte die Umlaute. Ist das jetzt UTF-8 oder nicht?
<?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> |
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 |
Re: Deppenfrage: Wie sieht UTF-8 aus?
Delphi-Quellcode:
So, und jetzt? :mrgreen:
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); 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. |
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? :) |
Re: Deppenfrage: Wie sieht UTF-8 aus?
Zitat:
|
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:... |
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:
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.
<?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> 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:
Mathematisch gesehen, sollte 'SaveToXML' die Umkehrfunktion von 'LoadXMLData' sein.
x := LoadXMLData (MyXMLString);
x.SaveToXML (sAnotherString); x1 := LoadXMLData (sAnotherString); // x und x1 sollen exakt die gleichen Daten enthalten. Stimmt nur nicht. Das klappt nur nicht, sondern erst, wenn ich mir einen abbreche:
Delphi-Quellcode:
Hab ich nun den Denkfehler, oder ist da was faul im Staate Dot.Net /XML ? :gruebel:
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 Ich hab in meinem jungendlichen Leichtsinn echt gedacht, das XML das alles für mich regelt... |
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. |
Re: Deppenfrage: Wie sieht UTF-8 aus?
Zitat:
|
Re: Deppenfrage: Wie sieht UTF-8 aus?
Zitat:
...:cat:... P.S.: By Unicode (Little-Endian) ist der Header dann widerum nur 2 Bytes :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz