Autor Téma: Vytvoření XML souboru v utf-8  (Přečteno 157 krát)

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 203
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Vytvoření XML souboru v utf-8
« kdy: 09-09-2019, 11:28:23 »
V Delphi 10.2 vytvářím XML dokument, který si pro kontrolu ukládám do souboru. Ani za nic nedokážu do hlavičky souboru dostat informaci o kódování a navíc nevím úplně jistě, jestli je soubor v kódování utf-8. Když jej načtu do PSPadu, ten mi hlásí: ANSI Central European (1250).
XML vytvářím takto:
Kód: Delphi [Vybrat]
  1.              
  2. var
  3. XMLOdp: IXMLDocument;
  4.  
  5.  
  6. XMLOdp := NewXMLDocument;
  7.               try
  8.                 try
  9.                   if XMLOdp.Active then
  10.                     XMLOdp.Active   := False;
  11.                   XMLOdp.XML.Text := '';
  12.                   XMLOdp.Active   := true;
  13.                   XMLOdp.Encoding := 'utf-8';
  14.                   iHlav := XMLOdp.AddChild('Results');
  15.  
  16.                   for i := 0 to DL.Hlavicky.Count-1 do
  17.                   begin
  18.                     // sestavit xml s potvrzenim
  19.                     iUzel := iHlav.AddChild('Result');
  20.                     iVetev := iUzel.AddChild('OrderId');
  21.                     iVetev.Text := DL.Hlavicky[i].CisloDL;
  22.                     iVetev := iUzel.AddChild('Date');
  23.                     iVetev.Text := FormatDateTime('yyyy-mm-dd', date);
  24.                     iVetev := iUzel.AddChild('ResultCode');
  25.                     iVetev.Text := DL.Hlavicky[i].StavKod;
  26.                     iVetev := iUzel.AddChild('OrderProcessed');
  27.                     iVetev.Text := FormatDateTime('yyyy-mm-dd', date);
  28.                     iVetev := iUzel.AddChild('Description');
  29.                     iVetev.Text := DL.Hlavicky[i].StavPopis;
  30.                   end;
  31.                   XMLOdp.XML.SaveToFile('W:\Karel\D10Tokyo\RestClientSSL\potvrzeni.xml');
  32.                   { tady je vlozeni xml do parametru RESTRequest a odeslani na server }
  33.                 except
  34.                   on e: Exception do begin
  35.                     mLog.Lines.Add(Format('Chyba pri vytvareni XML souboru pro odpoved: %s',[e.Message]));
  36.                   end;
  37.                 end; { try except }
  38.               finally
  39.                 if XMLOdp.Active then
  40.                   XMLOdp.Active := false;
  41.                 XMLOdp := nil;
  42.               end;
  43.  
  44.  
  45. {potvrzeni.xml vypada takto:}
  46. <?xml version="1.0"?>
  47. <Results><Result><OrderId>656</OrderId><Date>2019-09-09</Date><ResultCode>None</ResultCode><OrderProcessed>2019-09-09</OrderProcessed><Description>Duplicitní DL 656 vystavený 07.08.2018 u dodavatele IČO xxx byl načtený 09.09.2019  10:51:48</Description></Result><Result><OrderId>657</OrderId><Date>2019-09-09</Date><ResultCode>None</ResultCode><OrderProcessed>2019-09-09</OrderProcessed><Description>Duplicitní DL 657 vystavený 07.08.2018 u dodavatele IČO xxx byl načtený 09.09.2019  10:51:48</Description></Result><Result><OrderId>730</OrderId><Date>2019-09-09</Date><ResultCode>None</ResultCode><OrderProcessed>2019-09-09</OrderProcessed><Description>Duplicitní DL 730 vystavený 08.08.2018 u dodavatele IČO xxx byl načtený 09.09.2019  10:52:36</Description></Result></Results>
  48.  
  49.  
Proč nemá hlavička xml souboru informaci o kódování (encoding="utf-8") a jak se ujistit, že je to skutečně v utf-8? Jde tu informaci o kódování nějak vynutit?
Díky, K.

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 203
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Vytvoření XML souboru v utf-8
« Odpověď #1 kdy: 09-09-2019, 13:25:57 »
Jak to tak bývá, až napíšu dotaz, něco mě napadne a vyzkouším to a ono to zafunguje... :-[
Takže v uvedeném příkladu mám chybu, ukládám to z property XML:
Kód: Delphi [Vybrat]
  1. XMLOdp.XML.SaveToFile('W:\Karel\D10Tokyo\RestClientSSL\potvrzeni.xml');
V tomto případě je xml soubor s neúplnou hlavičkou a v kódování windows-1250.
Správně to má být bez XML:
Kód: Delphi [Vybrat]
  1. XMLOdp.SaveToFile('W:\Karel\D10Tokyo\RestClientSSL\potvrzeni.xml');
Teď to má hlavičku s encoding="utf-8" a soubor je v tomto kódování, dle PSPad Unicode UTF-8 no BOM (65001).

No a ještě jsem tam měl jednu chybu, v příkladu neuvedenou, ale ta mně navedla k výše uvedené chybě. Pro vložení do parametru RESTRequest jsem chtěl použít string, proto jsem string četl z XMLOdp.XML.Text. Místo stringu jsem teď použil msOdp: TMemoryStream.
Funguje správně:
Kód: Delphi [Vybrat]
  1. XMLOdp.SaveToStream(msOdp);
  2. msOdp.Position := 0;
  3. RESTReq.Params.AddItem('data', msOdp, pkREQUESTBODY, [poDoNotEncode], ctAPPLICATION_XML);
Odpověď uvádím, kdyby se s tím ještě někdo potýkal  ;)
K.