AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Wie kann ich eine UTF16-Codierte Textdatei als 8-Bit Ansistring einlesen?

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

Ein Thema von devidespe · begonnen am 19. Aug 2010 · letzter Beitrag vom 20. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2   
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
424 Beiträge
 
Delphi 10.4 Sydney
 
#1

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

  Alt 19. Aug 2010, 16:13
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.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21

Geändert von devidespe (19. Aug 2010 um 17:21 Uhr) Grund: Umbenennung des Threadtitels
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.002 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Umwandlung eines UTF16 kodierten Strings in normalen String

  Alt 19. Aug 2010, 16:20
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#3

AW: Umwandlung eines UTF16 kodierten Strings in normalen String

  Alt 19. Aug 2010, 16:26
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;
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.181 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Umwandlung eines UTF16 kodierten Strings in normalen String

  Alt 19. Aug 2010, 16:58
PS: AssignFile und Co. ist auch ab D2009 immernoch nur ANSI ... nix mit Unicode.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
424 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Umwandlung eines UTF16 kodierten Strings in normalen String

  Alt 19. Aug 2010, 17:20
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'>
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 19. Aug 2010, 17:26
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;
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.181 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 19. Aug 2010, 17:45
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.002 Beiträge
 
Delphi 10.4 Sydney
 
#8

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

  Alt 19. Aug 2010, 19:11
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.181 Beiträge
 
Delphi 10.4 Sydney
 
#9

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

  Alt 19. Aug 2010, 19:35
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
424 Beiträge
 
Delphi 10.4 Sydney
 
#10

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

  Alt 20. Aug 2010, 09:33
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.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf