Autor Téma: XML UTF-8 azbuka  (Přečteno 1889 krát)

Offline František

  • Hrdina
  • ****
  • Příspěvků: 260
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
XML UTF-8 azbuka
« kdy: 16-03-2017, 09:55:26 »
mam XML dokument, ktorý chcem zobraziť ako tabuľku, je to slovnik: Sk, EN, RU (azbuka)
akým spôsobom ho zobraziť a editovať?

v minulosti som používal XMLtransformProvider (XML maper), ale problém bol vždy s diakritikou a teda tu je problém aj s azbukou, a momentálne to už nie je v XE5 Profesional

Kód: Delphi [Vybrat]
  1. <preklad>
  2. <cislo>1</cislo>
  3. <sk>Ano</sk>
  4. <en>Yes</en>
  5. <ru>Да</ru>
  6. </preklad>
  7. <preklad>
  8. <cislo>2</cislo>
  9. <sk>Auto</sk>
  10. <en>Auto</en>
  11. <ru>Авто</ru>
  12. </preklad>
takto vyzera jadro XML-ka

takto mi zobrazi prve: Да
a druhe: Авто
« Poslední změna: 16-03-2017, 10:00:21 od František »

Online JaroB

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 19
    • Verze Delphi: D2007, XE2, XE6
Re:XML UTF-8 azbuka
« Odpověď #1 kdy: 16-03-2017, 10:47:04 »
jak vypadají metadata xml?

Offline František

  • Hrdina
  • ****
  • Příspěvků: 260
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:XML UTF-8 azbuka
« Odpověď #2 kdy: 16-03-2017, 12:05:34 »
myslíš xtr? lebo nič viac k tomu nemám

Online JaroB

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 19
    • Verze Delphi: D2007, XE2, XE6
Re:XML UTF-8 azbuka
« Odpověď #3 kdy: 16-03-2017, 12:28:17 »
myslím tohle

Kód: XML [Vybrat]
  1. <?xml version="1.0" encoding="UTF-8"?>

viz https://www.w3schools.com/xml/xml_syntax.asp

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1796
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:XML UTF-8 azbuka
« Odpověď #4 kdy: 16-03-2017, 14:10:31 »
takto vyzera jadro XML-ka
takto mi zobrazi prve: Да
a druhe: Авто
V XML problem nehledej, to je spravne a Delphi samozrejme umi jeho obsah spravne nacist i spravne zobrazit. Budes se muset pochlubit, co a jak delas,  protoze to, co uvadis, ze se ti zobrazuje, je ANSI nahled na znaky zakodovane v UTF-8 tj. nekde neco cte raw data a rovnou je zobrazuje ev. je nejak bezhlave convertuje tam za zpatky.

A jako vzdy je tvuj popis problemu vice nez nedostatecny :-( Takze za me: pokracovani jedine s SSCCE



Offline František

  • Hrdina
  • ****
  • Příspěvků: 260
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:XML UTF-8 azbuka
« Odpověď #5 kdy: 17-03-2017, 08:38:19 »
pripojil som aj cely príklad v prílohe,
ten riadok s metadata tam samozrejme je

zaujímavá je táto časť kódu
Kód: Delphi [Vybrat]
  1.   edit1.text:=utf8tostring(cds.FieldByName('ru').AsString);
  2.   edit2.text:=cds.FieldByName('ru').AsString;

po aplikovaní utf8tostring to je správne, ale ako povedať dbgridu aby to zobrazoval , alebo ako to povedat xmltransformprovajderu, pripadne ClientDatasetu aby to konvertoval správne

nedá sa niekde globálne nastaviť, že teraz aplikácie pracuje s UTF-8? Alebo je to chybný pohľad? Poučte ma, prosím.

ale ako som písal v úvode, beriem aj iné riešenie ako XML transformácie (TXMLTransformProvider)
« Poslední změna: 17-03-2017, 08:52:12 od František »

Offline František

  • Hrdina
  • ****
  • Příspěvků: 260
  • Karma: 2
    • Verze Delphi: XE5, 10.1 starter (BDS2006, XE)
Re:XML UTF-8 azbuka
« Odpověď #6 kdy: 18-03-2017, 20:11:42 »
neexistuje riesenie?

Online JaroB

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 19
    • Verze Delphi: D2007, XE2, XE6
Re:XML UTF-8 azbuka
« Odpověď #7 kdy: 18-03-2017, 21:59:20 »
Díval jsem se na to a podle mě to nějak divně zobrazuje DBGrid.
Dokonce jsem použil obezličku s nastavením s DefaultPageCode na utf-8 ale nepomohlo to :( na tom gridu.

Offline oxo

  • Guru
  • *****
  • Příspěvků: 696
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:XML UTF-8 azbuka
« Odpověď #8 kdy: 18-03-2017, 22:48:01 »
Good
Rated 2 times
Teď jsem na to schválně kouknul a co nevidím (Delphi 10 Seattle):
unit Data.DB.pas:
Kód: Delphi [Vybrat]
  1. function TStringField.GetAsString: string;
  2. begin
  3. {$IFNDEF NEXTGEN}
  4.   Result := string(GetAsAnsiString); // <<< ???
  5. {$ELSE}
  6.   if not GetValue(Result) then
  7.     Result := '';
  8. {$ENDIF !NEXTGEN}
  9. end;

... docela mazec... Nemá být náhodou Delphi od verze 2009 Unicode-ready 8)
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline oxo

  • Guru
  • *****
  • Příspěvků: 696
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:XML UTF-8 azbuka
« Odpověď #9 kdy: 18-03-2017, 23:05:19 »
Excellent
Rated 1 time
No asi si to budeš muset ošéfovat sám v OnGetText daného sloupce:

Kód: Delphi [Vybrat]
  1. procedure TForm3.cdsAfterOpen(DataSet: TDataSet);
  2. begin
  3.   cds.FieldByName('ru').OnGetText := ruOnGetText;
  4. end;
  5.  
  6. procedure TForm3.ruOnGetText(Sender: TField; var Text: string;
  7.   DisplayText: Boolean);
  8. begin
  9.   Text := UTF8ToString(Sender.AsAnsiString);
  10. end;
  11.  
  12. procedure TForm3.cdsAfterScroll(DataSet: TDataSet);
  13. begin
  14.   edit1.text:=cds.FieldByName('ru').DisplayText;
  15.   edit2.text:=cds.FieldByName('ru').DisplayText;
  16. end;
  17.  
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1796
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:XML UTF-8 azbuka
« Odpověď #10 kdy: 19-03-2017, 07:38:53 »
... docela mazec... Nemá být náhodou Delphi od verze 2009 Unicode-ready 8)
To uz jsme tu pred lety resili, ze jim TStringField zustalo buhvi proc ANSI, namatkou si vzpominam na svuj prispevek http://forum.delphi.cz/index.php/topic,13956.msg83077.html#msg83077.

Ja tu nemam Delphi s DataSnap, takze se na to nepodivam, ale vedle vyse zmineneho, co by se stalo, kdyby se u CDS radne nadefinovaly FieldDefs tak, aby odpovidaly XML dokumentu a obesly ftString. Nepomohlo by to nebo to ten TXMLTransformProvider vzdycky prepise?




Offline oxo

  • Guru
  • *****
  • Příspěvků: 696
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:XML UTF-8 azbuka
« Odpověď #11 kdy: 19-03-2017, 10:08:30 »
Když jsem si včera zkusil nadefinovat ftWideString místo ftString a k tomu TWideStringField, dostal jsem:

---------------------------
Debugger Exception Notification
---------------------------
Project cds_.exe raised exception class EDatabaseError with message 'cds: Type mismatch for field 'ru', expecting: WideString actual: String'.
---------------------------

Ale víc nevím, nejsem zrovna expert na DB komponenty v Delphi. Naposled jsem je používal tak před 15 lety...
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Online JaroB

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 19
    • Verze Delphi: D2007, XE2, XE6
Re:XML UTF-8 azbuka
« Odpověď #12 kdy: 20-03-2017, 07:56:06 »
tu fintu s definicí jako ftWideString jsem zkusil, ale domrská to vždycky.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1796
  • Karma: 77
    • Verze Delphi: D2007, XE3, DX10
Re:XML UTF-8 azbuka
« Odpověď #13 kdy: 20-03-2017, 08:25:39 »

Project cds_.exe raised exception class EDatabaseError with message 'cds: Type mismatch for field 'ru', expecting: WideString actual: String'.
[...]
Ale víc nevím, nejsem zrovna expert na DB komponenty v Delphi. Naposled jsem je používal tak před 15 lety...
Ja nikdy na nic nepouzival ten TXMLTransformer, jehoz smyslem je preprasit XML do proprietarniho formatu DataSnap, se kterym pracuje CDS...

Evidentne tam maji chybu: ten TXMLTransformer je rizen definici XSD a ta ma pro string jen xs:string, ktery je v kodovani XML dokumentu, ze standardu UTF-8. Na strane Delphi by z toho mel vylezt string tj. kodovani  UTF-16le, ktere je pro Windos nativni, coz se zrejme nestane a zustane to v UTF8, binding mezi transforemer a CDS to pak priradi to AsString, kde z toho setter udela ANSI :-(

Takze ta chyba spociva v pro mne nepochopitelnem zachovani AsString: ANSIString z pre-unicodifikovanych Delphi :-O

Reseni je asi ta navrhovana hand job a udelat si tu konverzi sam, nebo se vykaslat na TXMLTransformer, pomoci XMLBindingu si udelat definici DOM, do toho data nacist a pak s nimi bud primo pracovat, nebo je v cyklu nasypat do CDS...
« Poslední změna: 20-03-2017, 08:28:43 od pf1957 »

Online JaroB

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 19
    • Verze Delphi: D2007, XE2, XE6
Re:XML UTF-8 azbuka
« Odpověď #14 kdy: 20-03-2017, 08:56:08 »
Tohle nemá jednoduché řešení

Kód: Delphi [Vybrat]
  1. function TStringField.GetAsString: string;
  2. begin
  3. {$IFNDEF NEXTGEN}
  4.   Result := string(GetAsAnsiString);
  5. {$ELSE}
  6.   if not GetValue(Result) then
  7.     Result := '';
  8. {$ENDIF !NEXTGEN}
  9. end;

Chybí zřejmě funkce typu GetAsUtf8String, protože není jednoduché z povahy zdroje určit, co se vespod Field skrývá za data, proto je tam to čtení jako Ansi. S tímhle jsem se potýkal v čínštině, do DB ukládali data různě a všechno se to četlo přes ansi stringy :(

Takže v podstatě tohle je správně, do edit1 jde správný kód, z hlediska úrovně čtení víme, že zdroj je utf8. ale do edit2 jde jen proud charů
Kód: Delphi [Vybrat]
  1.   edit1.text:=utf8tostring(cds.FieldByName('ru').AsString);
  2.   edit2.text:=cds.FieldByName('ru').AsString;

ale pokud nastavím před otevřením datasetu

Kód: Delphi [Vybrat]
  1. DefaultSystemCodePage := CP_UTF8;

tak i edit2 drží správnou hodnotu!

Ale hodnota v gridu je stále nečitelná, jedině to vyřešit konverzí ve sloupci gridu anebo generálně v GetText nad Fields datasetu s příp. rozlišením flagu DisplayText


 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):