Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie kann ich eine UTF16-Codierte Textdatei als 8-Bit Ansistring einlesen? (https://www.delphipraxis.net/153900-wie-kann-ich-eine-utf16-codierte-textdatei-als-8-bit-ansistring-einlesen.html)

devidespe 19. Aug 2010 16:13


Wie kann ich eine UTF16-Codierte Textdatei als 8-Bit Ansistring einlesen?
 
Wie kann ich mit Delphi 2007 Pro einen UTF16 kodierten String in einen normalen String umwandeln?

Im speziellen Fall versuche ich, mit AssignFile/Reset/ReadLn eine per UTF16 kodierte Datei zu lesen. Es muss aber irgendeine Umwandlung geben, da ich ständig '#0' nach jedem Zeichen erhalte. Wenn ich die Datei mit ReadLn auslese und anstatt einem String einen WideString verwende, macht das keinen Unterschied.

Was kann man machen? Delphi 2007 ist ja noch nicht Unicode-fähig. Ich muss aber trotzdem einen Weg finden.

Bernhard Geyer 19. Aug 2010 16:20

AW: Umwandlung eines UTF16 kodierten Strings in normalen String
 
Du musst mit TFileStream arbeiten.

Beispiel wie sowas geht liefert die Jedi (JclUnicode), TNTWare (TTNTWideStringList) oder Elpack (TLMDWideStringList);
Hier im Forum müssten auch schon einige Codefragmente vorliegen (Codelib?)


Und deine Frage sollte eher lauten: Wie kann ich einen UTF16-Codierte Textdatei so einlesen das ich damit einen 8-Bit AnsiString füllen kann :wink:

littleDave 19. Aug 2010 16:26

AW: Umwandlung eines UTF16 kodierten Strings in normalen String
 
Quick'n'dirty:

Delphi-Quellcode:
function Utf16ToAnsi(const Input: WideString): AnsiString;
begin
  // Nur bis < Delphi 2009 - ab da ist UTF8Encode obsolute, gibt dafür aber ne neue Funktion
  result := Utf8ToAnsi(UTF8Encode(Input));
end;
und dann noch einen Ansi-String als WideString interpretieren:
Delphi-Quellcode:
// Einfach aus den Fingern gesogen - ohne Test
function AnsiAsUtf16(const Input: AnsiString): WideString;

  function internDupe(const s: WideString): WideString;
  begin
    result := s;
  end;

var p1: Pointer;
begin
  p1 := @Input;

  result := internDupe(PWideString(p1)^);
end;

himitsu 19. Aug 2010 16:58

AW: Umwandlung eines UTF16 kodierten Strings in normalen String
 
PS: AssignFile und Co. ist auch ab D2009 immernoch nur ANSI ... nix mit Unicode.

devidespe 19. Aug 2010 17:20

AW: Umwandlung eines UTF16 kodierten Strings in normalen String
 
Also die Utf16ToAnsi Funktion liefert bei mir den gleichen Text wie den Eingabetext zurück.

Das ist der Eingabetext, versuche doch mal ihn manuell zu übergeben:

<'#0'?'#0'x'#0'm'#0'l'#0' '#0'v'#0'e'#0'r'#0's'#0'i'#0'o'#0'n'#0'='#0'"'#0'1 '#0'.'#0'0'#0'"'#0' '#0'e'#0'n'#0'c'#0'o'#0'd'#0'i'#0'n'#0'g'#0'='#0'" '#0'U'#0'T'#0'F'#0'-'#0'1'#0'6'#0'"'#0'?'#0'>

littleDave 19. Aug 2010 17:26

AW: Wie kann ich eine UTF16-Codierte Textdatei als 8-Bit Ansistring einlesen?
 
Zitat:

Zitat von devidespe (Beitrag 1043477)
Also die Utf16ToAnsi Funktion liefert bei mir den gleichen Text wie den Eingabetext zurück.

Delphi ist so "klug" und wandelt konvertiert automatisch einen "string" in einen "WideString". Daher musst du das wie folgt machen:
Delphi-Quellcode:
function IchWillNenNormalenString_InhaltIstAberUTF16(input: AnsiString): AnsiString;
begin
  result := Utf16ToAnsi(AnsiAsUtf16(input));
end;

himitsu 19. Aug 2010 17:45

AW: Wie kann ich eine UTF16-Codierte Textdatei als 8-Bit Ansistring einlesen?
 
Bei XML ist halt nicht unbedingt ein BOM nötig/vorgeschrieben.
Die Streamingfunktionen seit Delphi 2009 können nun automatisch, anhand des BOM die Kodierung erkennen, wenn sie via BOM markert ist.

Und nun die Frage aller Fragen:
Warum wollen in letzter Zeit eigentlich ständig alle XML direkt als TEXT einlesen, anstatt einen ordentlichen XML-Parser zu nutzen, welcher sich um solche Kleinigkeiten kümmert?

Bernhard Geyer 19. Aug 2010 19:11

AW: Wie kann ich eine UTF16-Codierte Textdatei als 8-Bit Ansistring einlesen?
 
Zitat:

Zitat von himitsu (Beitrag 1043493)
Und nun die Frage aller Fragen:
Warum wollen in letzter Zeit eigentlich ständig alle XML direkt als TEXT einlesen, anstatt einen ordentlichen XML-Parser zu nutzen, welcher sich um solche Kleinigkeiten kümmert?

Frag ich mich auch immer. Die Antwort ist immer: "Ich will doch nur 2 Werte auslesen". Anstatt stundenlang zu suchen wie man es ohne XML (doch nicht) hinbekommt hätte man schon eine Lösung mit einem parser und die nächste XML-Datei wäre in 0,Nix zu verarbeiten weil man sich schon die Grundkenntnisse angeeignet hat.

himitsu 19. Aug 2010 19:35

AW: Wie kann ich eine UTF16-Codierte Textdatei als 8-Bit Ansistring einlesen?
 
Diese Leute sollten sich mal fragen, warum auch eine menge Zeit (teils Jahre) in die Entwicklung eines entsprechenden Parser einfliesen.
Und das von Leuten, welche schon ein bissl mehr Ahnung davon haben.

Aber naja, erfinde man einfach das Rad jedesmal neu. :roll:

devidespe 20. Aug 2010 09:33

AW: Wie kann ich eine UTF16-Codierte Textdatei als 8-Bit Ansistring einlesen?
 
Zitat:

Zitat von himitsu (Beitrag 1043493)
Und nun die Frage aller Fragen:
Warum wollen in letzter Zeit eigentlich ständig alle XML direkt als TEXT einlesen, anstatt einen ordentlichen XML-Parser zu nutzen, welcher sich um solche Kleinigkeiten kümmert?

Hier mal eine Gegenfrage: wieso versucht ihr unabhängig von den den genauen Anforderungen jedem einen XML-Parser aufzuschwatzen? Mag ja sein, dass Ihr damit positive Erfahrungen gemacht habt oder sogar vergleichbare Kompoenten entwickelt, das finde ich auch lobenswert. Aber für das Auslesen von 2 XML-Attributen sich in einen XML-Parser einarbeiten bringt aus meiner Sicht mehr Aufwand als Nutzen.

Ich habe den Aufwand auch schon betrieben, und zwar mit dem XML-Parser von http://www.destructor.de/, allerdings scheint er nicht Unicode-fähig zu sein. Eine Anfrage an den Autor blieb bislang unbeantwortet. Deswegen habe ich mich entschieden, anders vorzugehen. Dass wir aber gleich wieder eine Grundsatzdiskussion über XML-Parser führen war nicht meine Absicht, aber auch nicht von mir initiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 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