Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Unicode probleme (https://www.delphipraxis.net/119015-unicode-probleme.html)

day 19. Aug 2008 15:52


Unicode probleme
 
Hallo,
Ich habe folgendes Problem:
Ich möchte aus einem XML file einzelne Strings auslesen, welche chinesische symbole enthalten. Wenn ich mir das XMLFile ausgeben lasse (z.b. im Debugger oder log file), dann werden die symbole auch korrekt dargestellt. Wenn ich jedoch die XML struktur über die Nodes auslese, dann werden gewisse symbole durch Fragezeichen (?) ersetzt (allerdings nur ein paar wenige).

Hat jemand eine idee woran das liegen kann?


folgendermassen lese ich die nodes aus.
Delphi-Quellcode:
 XMLReader.LoadFromStream(TStringStream.Create(XMLFilte)) //XMLReader ist TXMLDocument
 .
 .
 .

 lStr := Node.Attributes['value']; // Node ist IXMLNode
Wenn ich Debugger auf dem Attributes bin, dann sehe ich noch dir korrekten Symbole. In der Variable lStr sind anschliessend allerdings teilweise Fragezeichen enthalten.

Ich habe auch schon probiert das ganze einem WideString zuzuweisen, allerdings funktionierts dann gar nicht mehr.

mkinzler 19. Aug 2008 15:54

Re: Unicode probleme
 
Welchen Typ hat lStr?

day 19. Aug 2008 16:11

Re: Unicode probleme
 
Ist ein normaler String.

Bernhard Geyer 19. Aug 2008 16:12

Re: Unicode probleme
 
Zitat:

Zitat von day
Ist ein normaler String.

Da mußt du bis Delphi 2009 warten das der Datentyp String Unicodefähig ist.
Bis dorthin mußt du WideString nehmen.
Und lass dich nicht von der IDE verwirren. Erste neuere (D2005/...) IDE Versionen zeigen Widestrings auch korrekt als Widestrings und nicht nur als Strings an.

day 19. Aug 2008 16:20

Re: Unicode probleme
 
Es scheint aber trotzdem auch mit Strings zu funktionieren. Wie gesagt sehe ich die chinesischen symbole auf meiner oberfläche es gibt lediglich ein paar symbole welche das IXMLNode (oder wahrscheinlich eher das TXMLDocument) nicht ausgeben können. Wenn ich den parser selber schreiben würde, dann würde es funktionieren!

Allerdings möchte ich das rad nicht neu erfinden....

Bernhard Geyer 19. Aug 2008 16:22

Re: Unicode probleme
 
Verwendest du VCL.NET oder WinForms?
Dort ist schon String Unicodeenabled.

Und was siehtst du bei den nicht ausgebbaren Zeichen? Hier hat vermutlich der Verwendete Font kein Zeichen vorhanden!

day 19. Aug 2008 16:31

Re: Unicode probleme
 
Also ich verwende die Standard TLabels (winforms). Also ich sehe die chinesischen Symbole und zwischen drin hat es manchmal Fragezeichen (?) anstelle des korrekten symbols. Das mit der Schrift kann ich mir nicht so richtig vorstellen, da ich es ja z.b. im logfile oder debugger richtig sehe. somit müsste die schriftart im windows installiert sein. (habe übrigens die sprachzusätze für asisatische sprachen installiert und regional settings umgestellt)

Bernhard Geyer 19. Aug 2008 16:38

Re: Unicode probleme
 
Zitat:

Zitat von day
Also ich verwende die Standard TLabels (winforms).

Dann ändere bitte deinen ersten Post. Du verwendest NICHT "Delphi (Win32)".

Zitat:

Zitat von day
Also ich sehe die chinesischen Symbole und zwischen drin hat es manchmal Fragezeichen (?).

Fragezeichen sind ein Zeichen für Codepagewandlung. Sollte bei .NET nicht auftreten.

day 19. Aug 2008 16:46

Re: Unicode probleme
 
Ok jetzt habe ich dich falsch verstanden. Ich verwende Delphi (win32) und benutze die Standard TLabels komponente

day 19. Aug 2008 16:47

Re: Unicode probleme
 
das wegen dem codepage dachte ich auch schon. kann es am encoding vom XML file liegen?

Bernhard Geyer 19. Aug 2008 16:51

Re: Unicode probleme
 
Zitat:

Zitat von day
Ok jetzt habe ich dich falsch verstanden. Ich verwende Delphi (win32) und benutze die Standard TLabels komponente

TLabels ist unter Win32 bis Delphi2009 nicht Unicode-Fähig. Hier helfen nur die Kompos von TNTWare (TMS) oder Elpack (LMD).

day 19. Aug 2008 16:55

Re: Unicode probleme
 
Ok vielleicht ist unicode der falsche titel. Ich versuche lediglich chinesische symbole darzustellen und so wie es aussieht hat der xml parser probleme alle symbole richtig auszugeben. Die TLabel komponente ist nicht das Problem, da die symbole ja angezeigt werden.

[EDIT]
Ich habe als Test alle chinesischen symbole im XML-File direkt dem TLabel (Caption) zugewiesen. Es wurden alle symbole im Label richtig angezeigt (auch die symbole die vorher nur ein Fragezeichen waren).

Bernhard Geyer 19. Aug 2008 16:59

Re: Unicode probleme
 
Du kannst mit TLabel auf einem deutschen System keine vollständige Chinesiche Textdarstellung erreichen. Die verwendung von Charsets/Codepages liefert dir nur eine m.E. Krückenlösung da nur ein Subset von zeichen verwendet werden kann.

day 19. Aug 2008 17:05

Re: Unicode probleme
 
Ja du kannst aber im windows unter regional settings die asiatischen sprachen zusätzlich installieren und anschliessend die code page und die "sprachversion der programme" auf chinesisch umstellen.

Anschliessend siehst du z.b. google.cn in chinesisch. Ich denke daher schon das alle symbole angezeigt werden können. Wie auch gesagt sehe ich im xml file alle symbole korrekt. wenn irgend ein symbol nicht erkannt werden würde, dann würde ich es da schon nicht als symbol sehen.

Bernhard Geyer 19. Aug 2008 18:36

Re: Unicode probleme
 
Kannst du mal ein Testprojekt + Test-XML zusammenstellen und hier posten?

day 20. Aug 2008 07:52

Re: Unicode probleme
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen,

Beiliegend habe ich einen kleinen Test gemacht welcher aus einem xml file einen wert ausliest. Ein symbol wird im label nur als ? dargestellt das andere korrekt. Ich habe noch ein printscreen beigelegt, damit man sieht wie die symbole aussehen sollten.

Beim label habe ich als Charset das DEFAULT_CHARSET verwendet. Wenn ich ein anderes verwende (z.B. CHINESEBIG5_CHARSET), stimmen die symbole nicht mehr mit dem XML file überein.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  lNode          : IXMLNode;
  lXMLStream     : String;
begin

lXMLStream := '<?xml version="1.0" encoding="ISO-8859-1"?> '
              + ' <el name="" value="&#35352;&#20303;" /> ';

 XMLDocument.LoadFromStream(TStringStream.Create(lXMLStream));
lNode := XMLDocument.ChildNodes.FindNode('el');

label1.Caption := lNode.Attributes['value'];  //caption ist ?ס
label2.Caption := '&#35352;&#20303;';
end;
Komischerweise funktioniert es mit dem ISO-8859-1 (ist westeuropäisch??!!) encoding am besten. Mit dem UTF-8 encoding geht es nicht.

vielen dank für deine Mühe

gruss

Bernhard Geyer 20. Aug 2008 08:02

Re: Unicode probleme
 
Dein Quellcode im Forum ist "verhunzt".

und in deinem JPEG weißt du chinesische Zeichen einem (Ansi-)String zu. Diese werden bei Win32 bis D2007 noch nach der ISO1252-Codepage gecastet. Außerdem ist dein XML (falls du die Chinesischen Zeichen unterbekommst) fehlerhaft Codiert. Diese mußt du codieren (AFAIK &<Hexwert>;). Bei UTF8 als encoding-Angabe mußt du natürlich auch die Daten UTF8-Codiert in deinem XML-string ablegen!

day 20. Aug 2008 08:19

Re: Unicode probleme
 
Was meinst du mit verhunzt? Den value siehst du nur wenn dein Betriebssytem auf asiatisch eingestellt hast. (ist dasselbe wenn du google.cn aufrufst). Das mit dem umcodieren ist so eine sache. Die werte sind so abgelegt. Das lässt sich nicht so einfach abändern. oder hast du eine idee?
Wahrscheinlich geht es schneller, wenn ich das xml-file selber parse und die werte auslese.

Was ich aber nicht verstehe ist, warum kann der parser nur ein teil der symbole parsen?

Bernhard Geyer 20. Aug 2008 08:32

Re: Unicode probleme
 
Zitat:

Zitat von day
Was meinst du mit verhunzt?

Jetzt passt es. Da hat wohl mein Firefox oder die DP versagt.

Zitat:

Zitat von day
Den value siehst du nur wenn dein Betriebssytem auf asiatisch eingestellt hast. (ist dasselbe wenn du google.cn aufrufst).


Zitat:

Zitat von day
Das mit dem umcodieren ist so eine sache. Die werte sind so abgelegt. Das lässt sich nicht so einfach abändern. oder hast du eine idee?

Gib doch mal eine Beispiel-XML rüber. Wenn ich deinen String als XML-Datei speichere wird mir jeder XML-Parser diese mit Exceptions um die Ohren schmeißen. Und speicher doch mal lXMLStream (was ja kein Stream ist da hier ja schon dein schönes Chinesisches Zeichen u.U. zerstört wurde) in einer Datei, benenne diese nach XML um und lass sie im IE oder Firefox anzeigen.

day 20. Aug 2008 08:57

Re: Unicode probleme
 
Hallo,
Ja du hast recht, wenn ich mein xml string in ein xml file kopiere und dann im internet explorer anzeigen lasse, dann sehe ich die symbole nicht mehr. wenn ich allerdings das xml file im wordpad aufmache dann funktioniert es.

Ich vermute ich weiss auch woran das liegt. Unter Regional settings im Reiter "Erweitert" gibt es den Bereich "Sprache für Programme, die Unicode nicht unterstüzen". Da habe ich die Sprachversion auf chinesisch umgestellt. Notepad und Wordpad sind wahrscheinlich genau solche programme und darum interpretieren sie den wert anders als ein internet explorer der ja ein programm ist welches unicode unterstützt.

somit bleibt mir wahrscheinlich nichts anderes übrig als einen eigenen parser zu schreiben.

Bernhard Geyer 20. Aug 2008 09:05

Re: Unicode probleme
 
Zitat:

Zitat von day
Hallo,
Ja du hast recht, wenn ich mein xml string in ein xml file kopiere und dann im internet explorer anzeigen lasse, dann sehe ich die symbole nicht mehr. wenn ich allerdings das xml file im wordpad aufmache dann funktioniert es.

Wordpad ist auch kein XML-parser. Dem könntest du ach eine Exe öffnen lassen und es würde "funktionieren".

Zitat:

Zitat von day
Ich vermute ich weiss auch woran das liegt. Unter Regional settings im Reiter "Erweitert" gibt es den Bereich "Sprache für Programme, die Unicode nicht unterstüzen". Da habe ich die Sprachversion auf chinesisch umgestellt. Notepad und Wordpad sind wahrscheinlich genau solche programme und darum interpretieren sie den wert anders als ein internet explorer der ja ein programm ist welches unicode unterstützt.

Notepad und Wordpad sind auch Unicodefähige Programme. Nur jedoch keine XMl-parser so das sie eine kaputte XML Datei genauso öffnen wie eine Well-Formed-Datei.

Zitat:

Zitat von day
somit bleibt mir wahrscheinlich nichts anderes übrig als einen eigenen parser zu schreiben.

Wenn du ein paar Wochen Zeit übrig hast um deine fehlendes Verständnis für XML in SW zu gießen um auch die kaputten XML-Dateien zu lesen: Bitte.

day 20. Aug 2008 09:16

Re: Unicode probleme
 
hallo,
Ist mir schon klar das Wordpad kein xml-parser ist. Der unterschied liegt ja darin, dass ich das selbe file ( in Wordpad ) in einem chinesischen Betriebsystem anzeigen kann, wohingegen bei einem deutschen Betriebssystem man nur irgend welche character sieht. Also ich habe das xml file ergänzt und das encoding auf UTF-8 gesetzt. Jetzt kann ich das file im explorer öffnen. Mit dem iso... encoding kann er es nicht öffnen.

Delphi-Quellcode:
<?xml version="1.0" encoding="UTF-8"?>
<process name="test">
  <element>  
    <label name="testelement" value="&#31957;&#40670;&#65288;&#29305;&#21029;&#39135;&#35676;)" />
  </element>
</process>

Bernhard Geyer 20. Aug 2008 09:32

Re: Unicode probleme
 
Häng die XMl_Datei mal als Anhang an.

day 20. Aug 2008 10:07

Re: Unicode probleme
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Folgende XML datei kann ich im IE öffnen und wird richtig dargestellt. Habe sie im notepad bearbeitet und als UTF-8 encoding gespeichert. Arbeite im Windowsbetriebssystem mit chinesischen einstellungen.

Dafür kriege ich mit dem TXMLDocument nur noch fragezeichen. Liegt das jetzt am TLabel?

Bernhard Geyer 20. Aug 2008 10:30

Re: Unicode probleme
 
Zitat:

Zitat von day
Dafür kriege ich mit dem TXMLDocument nur noch fragezeichen. Liegt das jetzt am TLabel?

Vermutlich ja. Oder irgendwo im restlichen Quellcode.
gibt mal den Text nicht nach TLabel sondern mittels MessageBoxW aus.

mkinzler 20. Aug 2008 10:32

Re: Unicode probleme
 
Die Zuweisung per Hand an das Label funktioniert ja, so wird das Problem nicht unbedingt am Label liegen. Eher am XML-Parser

day 20. Aug 2008 10:36

Re: Unicode probleme
 
Ich vermute es könnte daran liegen, dass der parser mir richtige Unicode zeichen zurück gibt, das TLabel aber die unicode zeichen nicht interpretieren kann (da es nicht unicode fähig ist). aber wie gesagt ist nur eine vermutung. Bis jetzt konnte ich es noch nicht beweisen das es so ist.


Habe noch eine kleine Anmerkung:
Wenn ich mein XML-File als unicode abspeichere, dann kann ich es im IE nicht öffnen (es kommt eine Fehlermeldung). wenn ich es als ANSI abspeichere, kann ich es zwar im IE aufmachen, allerdings werden die Symbole nicht richtig angezeigt. Wenn ich es hingegen als UTF-8 abspeichere wird es sauber angezeigt.

Wenn ich das File im Notepad oder Wordpad aufmache ist es egal wie ich es abgespeichert habe. Die Symbole werden immer richtig angezeigt.

mkinzler 20. Aug 2008 10:41

Re: Unicode probleme
 
Verwndest du nun Delp.Net oder Delphi Win32. Dem Icon nach ist es Delphi 7. Dessen VCL ist nicht unicode-fähig

Bernhard Geyer 20. Aug 2008 10:43

Re: Unicode probleme
 
Zitat:

Zitat von day
Habe noch eine kleine Anmerkung:
Wenn ich mein XML-File als unicode abspeichere, dann kann ich es im IE nicht öffnen (es kommt eine Fehlermeldung). wenn ich es als ANSI abspeichere, kann ich es zwar im IE aufmachen, allerdings werden die Symbole nicht richtig angezeigt. Wenn ich es hingegen als UTF-8 abspeichere wird es sauber angezeigt.

Wenns du Notepad nimmst bist du selbst schuld. Dieser wird dir dein XML schön zerstören. Nimm UTF8 für die Speicherung dann geht es auch mit Notepad + IE.

day 20. Aug 2008 10:49

Re: Unicode probleme
 
Ja also eigentlich benutze ich wordpad. Aber wie gesagt im Wordpad / Nodepad kommt es nicht darauf an mit welchem encoding ich es abspeichere. Es wird in diesen Programmen immer korrekt agezeigt.

Ich glaube mein eigentliches Problem ist der Parser nicht mit den TLabels zusammenpasst.

mkinzler 20. Aug 2008 10:51

Re: Unicode probleme
 
Welche Delphiversion setzt du nun ein?

day 20. Aug 2008 10:52

Re: Unicode probleme
 
oh sorry, benutze delphi 7

Bernhard Geyer 20. Aug 2008 10:55

Re: Unicode probleme
 
Zitat:

Zitat von day
Ja also eigentlich benutze ich wordpad. Aber wie gesagt im Wordpad / Nodepad kommt es nicht darauf an mit welchem encoding ich es abspeichere. Es wird in diesen Programmen immer korrekt agezeigt.

Es ist aber defekt (wie du mit dem IE feststellen kannst). öffne doch mal die mit Unicode gespeicherte XML-Datei in der Delphi-IDE und du wirst sehen was dem IE stört.

mkinzler 20. Aug 2008 10:57

Re: Unicode probleme
 
Zitat:

Zitat von day
oh sorry, benutze delphi 7

Dann ist TLabel nicht unicodefähig. Höchstens du verwendest TNTUnicode o.ä.

day 20. Aug 2008 11:01

Re: Unicode probleme
 
ja im windows gibt es die erweiterung, das nicht unicode fähige programme unicode fähig gemacht werden können (regional settings). Damit klappt es eigentlich ganz gut. Wie gesagt kann ich etwa 90% der chinesischen symbole darstellen in meinem Programm. Die restlichen 10% werden (so vermute ich) von meinem parser verschluckt und eben als ? zurück gegeben.

day 20. Aug 2008 11:05

Re: Unicode probleme
 
Zitat:

Zitat von Bernhard Geyer
Es ist aber defekt (wie du mit dem IE feststellen kannst). öffne doch mal die mit Unicode gespeicherte XML-Datei in der Delphi-IDE und du wirst sehen was dem IE stört.

Ja du hast recht. Wenn ich die Datei (unicode) in Delphi aufmache sind diverse zeichen zusätzlich im file enthalten. Allerdings stellt die Delphi-IDE die datei, welche ich mit ANSI encoding abgespeichert habe richtig dar.

mkinzler 20. Aug 2008 11:11

Re: Unicode probleme
 
Das ist aber kein Unicode. Lade dir mal die TntUnicode-Controls herunter und schau mal was er damit darstellt.

day 20. Aug 2008 11:17

Re: Unicode probleme
 
hallo,
danke werde es mal anschauen

day 20. Aug 2008 11:39

Re: Unicode probleme
 
Hallo,
Habs ausprobiert mit den Componenten und es funktioniert auch wenn man richtiges Unicode verwendet. Da in meinen XML-Files (und entsprechend in der Datenbank) so ein zwischen ding gespeichert ist, kann ich meine symbole bei diesen componenten nicht mehr darstellen.

mkinzler 20. Aug 2008 11:41

Re: Unicode probleme
 
Was verstehst du unter Zwischending? GGf richtiges Unicode in DB und Dateien verwenden


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 Uhr.
Seite 1 von 2  1 2      

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