Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   UnicodeConverter/ Unicode-Bibliothek (https://www.delphipraxis.net/102180-unicodeconverter-unicode-bibliothek.html)

BUG 24. Okt 2007 17:43


UnicodeConverter/ Unicode-Bibliothek
 
Liste der Anhänge anzeigen (Anzahl: 2)
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

Muetze1 24. Okt 2007 19:46

Re: UnicodeKonverter
 
Hmm, sieht recht gut aus. Darf ich mir darauf vllt. ein paar Ideen ableiten (oder vllt. die ganzen Units nutzen) für meine XMLLib2?

BUG 24. Okt 2007 20:51

Re: UnicodeKonverter
 
Hallo Muetze1,

Zitat:

Zitat von Muetze1
XMLLib2

Genau für solche Fälle wollte ich die Unit schreiben :-D (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

Muetze1 25. Okt 2007 00:05

Re: UnicodeKonverter
 
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.

xZise 29. Okt 2007 15:52

Re: UnicodeKonverter
 
Zitat:

[Pascal Fehler] Unicode.pas(28): E2100 Datentyp zu groß: 2 GB überschritten
Das bekomme ich in Unicode.pas (TD-E)

shmia 29. Okt 2007 16:20

Re: UnicodeKonverter
 
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.

BUG 29. Okt 2007 18:11

Re: UnicodeKonverter
 
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
Delphi-Quellcode:
type TUniCharBuffer = packed array[0..(high(TSize) div SizeOf(TUniChar) -1)] of TUniChar;
Hieran liegt es, oder?
Probiers so:
Delphi-Quellcode:
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

Muetze1 30. Okt 2007 10:08

Re: UnicodeKonverter
 
Nutze doch sonst einfach die Konstante Delphi-Referenz durchsuchenMaxInt

xZise 30. Okt 2007 14:22

Re: UnicodeKonverter
 
Zitat:

Zitat von BUG
@xZise
Delphi-Quellcode:
type TUniCharBuffer = packed array[0..(high(TSize) div SizeOf(TUniChar) -1)] of TUniChar;
Hieran liegt es, oder?
Probiers so:
Delphi-Quellcode:
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;

BUG 30. Okt 2007 14:26

Re: UnicodeKonverter
 
Zitat:

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?


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