AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte UnicodeConverter/ Unicode-Bibliothek

UnicodeConverter/ Unicode-Bibliothek

Ein Thema von BUG · begonnen am 24. Okt 2007 · letzter Beitrag vom 5. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von BUG
BUG
Registriert seit: 4. Dez 2003
Moin moin,

Die angehängte Bibliothek ist etwas für alle, die Spaß an Unicode in UTF-32 Codierung haben, sie unterstützt das Laden und Speichern aus/als:
  • UTF 8
  • UTF 16 BE
  • UTF 16 LE
  • UTF 32 BE
  • UTF 32 LE

Das Ganze funktioniert mit einem selbst implementierten Unicode-String (TUniString), der 32-bit breite Zeichen enthält.

NEU: Diese habe ich jetzt nochmal überarbeitet, der TUnichar entspricht jetzt LongInt, ist damit besser zu vergleichen und kann auch sonst als ordinaler Wert behandelt werden ...

Das Ganze nutzt ziemlich intensiv Streams und Exceptions.

NEU: Außerdem gibt es jetzt einen Nachfahre von TStream, der darauf zugeschnitten ist, einfacher in einen WideString zu schreiben, bzw. aus ihm zu lesen.

Bibliothek und Programm hab ich jetzt mal getrennt, nehmt den UnicodeConverter mal als einfaches Anwendungsbeispiel.

Falls ihr Unicode-Text zum Testen braucht, einen UTF-8 Sampler gibt es hier.

MfG,
Bug
Angehängte Dateien
Dateityp: zip unicodeconverter_175.zip (231,7 KB, 136x aufgerufen)
Dateityp: zip unicode_348.zip (147,5 KB, 129x aufgerufen)
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
 
Muetze1
 
#2
  Alt 24. Okt 2007, 20:46
Hmm, sieht recht gut aus. Darf ich mir darauf vllt. ein paar Ideen ableiten (oder vllt. die ganzen Units nutzen) für meine XMLLib2?
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG
 
#3
  Alt 24. Okt 2007, 21:51
Hallo Muetze1,

Zitat von Muetze1:
XMLLib2
Genau für solche Fälle wollte ich die Unit schreiben (XML, Unicode-Inifiles, Parser, usw.)

Wen du die Units oder Code daraus verwenden möchtest, bitte ich darum, in den Credits und/oder Dokumentation erwähnt zu werden.

Desweiteren wär ich glücklich, wenn du mir mitteilen würdest, wenn du am Code etwas änderst (das ist aber nicht zwingend).

Für die korrekte Funktion des Codes übernehme ich keine Garantie/Haftung.

Ansonsten bin ich sehr glücklich, wenn meine Units eine sinnvolle Verwendung finden

MfG,
Bug
  Mit Zitat antworten Zitat
Muetze1
 
#4
  Alt 25. Okt 2007, 01:05
Klar, keine Einwände. Und erwähnt hätte ich dich so oder so. Aber das ganze wird sich noch ein wenig hinziehen, da es nur ein nebenläufiges Projekt ist.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#5
  Alt 29. Okt 2007, 16:52
Zitat:
[Pascal Fehler] Unicode.pas(28): E2100 Datentyp zu groß: 2 GB überschritten
Das bekomme ich in Unicode.pas (TD-E)
Fabian
  Mit Zitat antworten Zitat
shmia

 
Delphi 5 Professional
 
#6
  Alt 29. Okt 2007, 17:20
Als Anregung:
Ich verwende zum Tauschen der Byte Order folgende Funktion:
Delphi-Quellcode:
// Hilfsfunktion zum vertauschen der Byteorder in einem WideString
procedure SwapWideString(var ws:WideString);
var
   i : Integer;
begin
   for i := 1 to length(ws) do
      ws[i] := WideChar(Swap(Ord(ws[i])));
end;
Beim byteweisen Einlesen sehe ich Performanceprobleme.
Ich lese UFT16 direkt auf einen WideString ein.
Wenn die BOM = $FFFE ist dann wird obige Procedure aufgerufen.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG
 
#7
  Alt 29. Okt 2007, 19:11
Hallo zusammen,

@shmia
Delphi-Quellcode:
function readCharFromUTF16le(src: TStream): TUniChar;
var UTF16Buffer: array[0..1] of byte;
begin
     if src.Read(UTF16Buffer, SizeOf(UTF16Buffer)) = SizeOf(UTF16Buffer) then
     begin
          // ...
     end else raise EUnexpectedEndOfStream.Create('class function TUniConverter.readCharFromUTF16BE(dest: TStream): TUniChar;');
end;
So weit ich sehen, werden hier 16 Bit auf einmal eingelesen, aber du hast recht, das schnellste wird wohl nicht sein.
Einen WideString wollte ich bewusst nicht verwenden, da ich in einem Charakter einen ganzen Unicode-Buchstaben unterzukriegen will.

@xZise
type TUniCharBuffer = packed array[0..(high(TSize) div SizeOf(TUniChar) -1)] of TUniChar; Hieran liegt es, oder?
Probiers so:type TUniCharBuffer = packed array[0..(2147483648 div SizeOf(TUniChar) -1)] of TUniChar; (2147483648 = 2 GByte)

Für dein Problem kannst du dir den TUniString auch sparen, wenn du die Buchstaben selbst irgendwie pufferst ...

MfG,
Bug
  Mit Zitat antworten Zitat
Muetze1
 
#8
  Alt 30. Okt 2007, 11:08
Nutze doch sonst einfach die Konstante Delphi-Referenz durchsuchenMaxInt
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#9
  Alt 30. Okt 2007, 15:22
Zitat von BUG:
@xZise
type TUniCharBuffer = packed array[0..(high(TSize) div SizeOf(TUniChar) -1)] of TUniChar; Hieran liegt es, oder?
Probiers so:type TUniCharBuffer = packed array[0..(2147483648 div SizeOf(TUniChar) -1)] of TUniChar; (2147483648 = 2 GByte)
Seltsam Übrigens hat er noch nichtmal das akzeptiert. Erst als ich 2GiB - 1 genommen habe.

Aber z.Zt. mach die Funktion Probleme:
Delphi-Quellcode:
function readStringFromStream(src: TStream; x: TStringFormat; stop: TReadStop; dest: TUniString): TReadStop;
var readfunc: TReadFunc;
    cur : TUniChar;
begin
     readfunc := getReadFunc(x);
     result := $00;
     if assigned(readfunc) then
     begin
          while (true) do
          begin
               try
                  cur := readfunc(src);
               except
                     on EUnExpectedEndOfStream do
                     begin
                          result := RS_END_OF_STREAM;
                          break;
                     end else raise;
               end;
               if isCharEqual(cur, TUNICHAR_NL_UNIX) and (stop and RS_NL_UNIX = RS_NL_UNIX) then
               begin
                    result := RS_NL_UNIX;
                    break;
               end;
               if isCharEqual(cur, TUNICHAR_NL_MAC) and (stop and RS_NL_MAC = RS_NL_MAC) then
               begin
                    result := RS_NL_MAC;
                    break;
               end;
               if isCharEqual(cur, TUNICHAR_NULL) and (stop and RS_NULL = RS_NULL) then
               begin
                    result := RS_NULL;
                    break;
               end;
               dest.addChar(cur);
          end;
     end else raise EUnicode.Create('Stringformat not supported: '+ StringFormatToString(x));
end;
Und zwar bleibt er da hängen.

MfG
xZise

PS: Vielleicht ist es wichtig, aber so speichere ich:
Delphi-Quellcode:
fs := TFileStream.Create(<Dateiname>, fmCreate);
temp := TUniString.Create;
ms := TMemoryStream.Create;
try
  temp.setTrimFlag(false);
  temp.setBufferSize(256);
  Memo.Lines.SaveToStream(ms);
  writeBOM(Format, fs);
  readStringFromStream(ms, Format, RS_END_OF_STREAM, temp);
  writeStringToStream(temp, Format, fs);
finally
  ms.Free;
  fs.Free;
  temp.Free;
end;
Fabian
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG
 
#10
  Alt 30. Okt 2007, 15:26
Zitat von xZise:
Aber z.Zt. mach die Funktion Probleme:
//...
Und zwar bleibt er da hängen.
Das ist sehr allgemein, was passiert genau (Exception, Unendliche Schleife, irgendwelche Fehlermeldungen?).

MfG,
Bug

//EDIT: Welchen Wert hat Format bei dir? Und wieso speicherst du den String wieder in dem Format, indem du ihn auch einliest?
  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 10:19 Uhr.
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