AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

UTF8 nach Unicode

Ein Thema von backdraft · begonnen am 7. Sep 2019 · letzter Beitrag vom 18. Sep 2019
Antwort Antwort
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
339 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: UTF8 nach Unicode

  Alt 8. Sep 2019, 11:49
Kleiner Hinweis: Der Algorithmus konvertiert zwischen CESU-8 und UTF-16 („WideString“). Außerdem kann er zwischen UTF-8 und UCS-2 konvertieren. Für die Umwandlung zwischen UTF-8 und Unicode ist die Unterstützung von 4-Byte-Codes nötig, für die Umwandlung zwischen UTF-8 und UTF-16 fehlt zusätzlich die Unterstützung von Surrogates (die sind in CESU-8 schon drin, daher funktioniert dein Code problemlos mit CESU-8).
Delphi Rio nutzt doch als Typ für string einen WideString oder auch UnicodeString. Du schreibst, das ist UTF-16.
UTF-16 hat aber doch ggf. mehr als 2 Byte pro Zeichen.
Und WideString sind doch immer fest 2 Byte pro Zeichen, oder irre ich?
Bin jetzt eher verwirrt.

Bezüglich CESU-8. Was erzeugt TEncoding.UTF8 in Delphi denn?

Ich brauche auf jeden Fall einen Konverter von einem String aus Delphi 10.3 und einem XML UTF-8 Datenstrom.
Komm ich das mit dem CESU-8 zurecht?

Vielen Dank schonmal für die Hilfe
Oliver
Oliver
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: UTF8 nach Unicode

  Alt 8. Sep 2019, 12:07
Dafür nimmt man eigentlich TStreamReader und TStreamWriter .

Stream und Encoding angeben, und dann per ReadBlock/Write die Daten von links nach rechts schieben.

Und das ganze mit einer Handvoll Code:
Delphi-Quellcode:
procedure Transfer(ASource: TStream; ASourceEncoding: TEncoding; ADest: TStream; ADestEncoding: TEncoding);
const
  bufferSize = 2048;
var
  reader: TStreamReader;
  writer: TStreamWriter;
  buffer: TCharArray;
  readCount: Integer;
begin
  reader := TStreamReader.Create(ASource, ASourceEncoding);
  try

    writer := TStreamWriter.Create(ADest, ADestEncoding);
    try
      SetLength(buffer, bufferSize);

      repeat
        readCount := reader.ReadBlock(buffer, 0, bufferSize);
        if readCount > 0 then
          writer.Write(buffer, 0, readCount);
      until (readCount < bufferSize);

    finally
      FreeAndNil(writer);
    end;

  finally
    FreeAndNil(reader);
  end;
end;

Geändert von Schokohase ( 8. Sep 2019 um 13:33 Uhr)
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
339 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: UTF8 nach Unicode

  Alt 8. Sep 2019, 18:05
Ahh, cool, das klingt easy.
Und durch das SourceEncoding ließt er auch immer volle Zeichen ein?
Ich meine, ich hab ja das Problem bei meinem Code, dass das Buffer Ende auf ein Zeichen fällt, was 3 Byte benötigt in UTF8 und nur 2 noch zu Verfügung stehen. Da muss ich ja wieder mit einem Seek zurückfahren im SourceFile.
Wäre ja cool, wenn das hier nicht ist.
Danke
Oliver
Oliver
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.136 Beiträge
 
Delphi 2009 Professional
 
#4

AW: UTF8 nach Unicode

  Alt 8. Sep 2019, 19:52
Delphi Rio nutzt doch als Typ für string einen WideString oder auch UnicodeString. Du schreibst, das ist UTF-16.
UTF-16 hat aber doch ggf. mehr als 2 Byte pro Zeichen.
Und WideString sind doch immer fest 2 Byte pro Zeichen, oder irre ich?
Bin jetzt eher verwirrt.
WideString ist ein Windows-Typ und Windows ab 2000 definiert WideStrings als UTF-16LE (Vorgänger-NTs: UCS-2LE). Sie kodieren jedes Zeichen mit 2 oder 4 Bytes, da man die 1.112.064 Codepunkte nicht mit 2 Bytes darstellen kann.

Bei den 2-Byte-Zeichen ist UTF-16 dasselbe wie UCS-2 (und UTF-8 dasselbe wie CESU-8), Zeichen darüber werden durch Surrogates kodiert, die sich an der Stelle 0xD800 bis 0xDFFF in der Ebene 0 (BMP) befinden. Die Surrogates sind keine Codepunkte und haben deshalb in UTF-8 nichts zu suchen. Der Versuch, Surrogates wie Codepunkte zu behandeln führt zu CESU-8, das Zeichen mit 1, 2, 3 oder 6 Byte kodiert.

Bezüglich CESU-8. Was erzeugt TEncoding.UTF8 in Delphi denn?
UTF-8.

Ich brauche auf jeden Fall einen Konverter von einem String aus Delphi 10.3 und einem XML UTF-8 Datenstrom.
Komm ich das mit dem CESU-8 zurecht?
Legt eine Software eine UTF-8-Eingabe zunächst als UTF-16 im Speicher ab und führt sie keine gesonderte Prüfung durch, unterstützt sie auch CESU-8.
Es gibt Software, die behauptet, UTF-8 zu unterstützen, meint aber CESU-8. Jeweils andere Programme unterstützen nur die BMP, sodass die Frage egal ist. Teilweise stürzen Programme auch ab, wenn man das jeweils andere eingibt.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
339 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: UTF8 nach Unicode

  Alt 18. Sep 2019, 08:28
Also ich nutze jetzt den TStreamWriter und damit klappt alles super
Vielen Dank für den Tipp.
Oliver
  Mit Zitat antworten Zitat
Antwort Antwort

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 21:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz