Results 1 to 4 of 4

Thread: Hoe kan ik zorgen dat een XML outputfile in UTF-8 staat?

  1. #1
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426

    Hoe kan ik zorgen dat een XML outputfile in UTF-8 staat?

    Hoi,

    Mijn applicatie ( XE7) bouwt XML-bestanden. In de header staat netjes <?xml version="1.0" encoding="UTF-8"?>.
    Een van de ontvangers van de bestanden klaagt desondanks dat er bij import regelmatig de foutmelding verschijnt:

    UTFDataFormatException: Invalid byte 2 of 3-byte UTF-8 sequence.

    Uit wat ik op het internet kan vinden lijkt de meest aannemelijke oorzaak een mismatch tussen de gesuggereerde UTF-8 codering en de werkelijke codering en dan met name bij het voorkomen van diakritische tekens (dus niet altijd).

    Ik bouw de XML nu als string die ik vervolgens laat zien in een memo ter controle ( memo.text:=MyXMLstring). Het bestand wordt opgeslagen via memo.savetofile. Daar zal het wel misgaan. Wat is de formele codering van zo'n bestand?

    Als ik de functie Utf8Encode() gebruik hoe krijg ik de resulterende _RawBiteStr dan in een bestand?

  2. #2
    ipv opslaan via memo zelf:
    Delphi Code:
    1. const
    2.   UTF8BOM: array[0..2] of Byte = ($EF, $BB, $BF);
    3. var
    4.   UTF8Str: UTF8String;
    5.   FS: TFileStream;
    6. begin
    7.   UTF8Str := UTF8Encode(Memo1.Text);
    8.  
    9.   FS := TFileStream.Create('C:\path to\file.txt', fmCreate);
    10.   try
    11.     FS.WriteBuffer(UTF8BOM[0], SizeOf(UTF8BOM));
    12.     FS.WriteBuffer(PAnsiChar(UTF8Str)^, Length(UTF8Str));
    13.   finally
    14.     FS.Free;
    15.   end;
    16. end;

    deze oplossing heb ik hier gevonden:
    stackoverflow.com

    Voor zover ik weet gebruikt delphi vanaf D2010 widestrings (utf-16). Deze zal hierdoor standaard als widestring opslaan vermoed ik?

  3. #3
    Senior Member
    Join Date
    Mar 2002
    Location
    Edam
    Posts
    426
    Dank!... ga ik implementeren!.. Ik had op van alles gezocht maar niet gewoon op "save memo as utf-8"

    In theorie zou het niet uit moeten maken of je een XML-document volgens utf-8 codeert en de standaard encoding="UTF-8" meegeeft of dat je het document niet hercodeert maar alleen de encoding regel aanpast in de XML-header. Hoe zit dat echter in de praktijk?. Natuurlijk zal een "goede" importapplicatie hier geen moeite mee hebben maar ik kan me voorstellen dat het gebruik van utf-8 zo standaard dat er applicaties zijn die bestanden die niet in utf-8 staan gewoon weigeren. Kan je een specifieke encoding afdwingen via een XSD?

  4. #4
    Ik weet niet heel erg veel van de soorten encoding, enkel dat UTF8 en UTF16 meer of minder bytes per karakter gebruiken. Misschien gaat het daarin mis, als je dus de tekst opent met UTF8 encoding en per karakter heb je meer bytes gaat hij dus verkeerd lezen. Heb dit zelf wel gehad met D7 opslaan als UTF8 waar hij wel de UTF8 bom wegschreef maar de karakters weg schreef als Ansi welke kleiner zijn in bytes per karakter.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •