Delphi-PRAXiS

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?

xZise 30. Okt 2007 15:52

Re: UnicodeKonverter
 
Zitat:

Zitat von BUG
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?).

Mist ;) Es ist eine endlose Schleife.
Wobei dort die Schleife ist ;)

Zitat:

Zitat von BUG
//EDIT: Welchen Wert hat Format bei dir? Und wieso speicherst du den String wieder in dem Format, indem du ihn auch einliest?

Format hat verschiedene Werte:
U32L
U32B

Den Rest (U16B, U8) habe ich nicht getestet.

Und ich speichere nicht in den gleichen Format.
Jedenfalls sollte er es nicht machen :)
Er speichert den Inhalt eines Memos in einen Unicodeformat.

MfG
xZise

BUG 31. Okt 2007 18:43

Re: UnicodeKonverter
 
xZises Beitrag
Zitat:

Ich habe es genauso gemacht.
Also funktioniert es jetzt, oder?
Wenn ja, wo lag den der Fehler?

MfG,
Bug

xZise 2. Nov 2007 12:57

Re: UnicodeKonverter
 
Hmmm, ich habe das jetzt auf das TTntMemo angepasst, und sagt immer unerwartetes Ende.

Dabei habe ich das einlese Format in UTF 16 le geändert

[edit]Hehe ^^ Ich habe es ;)
Bei .SaveToStream ist .Position vom Stream auf .Size gesetzt!
Wenn ich .Position auf 2 setze funktioniert alles wunderbar![/edit]

BUG 5. Feb 2008 01:29

Re: UnicodeConverter/ Unicode-Bibliothek
 
Neue Version:
  • Umstellung des TUniChar auf LongInt
  • einfacherer Umgang im Zusammen mit WideStrings
MfG,
Bug


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