![]() |
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:
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 ![]() MfG, Bug |
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?
|
Re: UnicodeKonverter
Hallo Muetze1,
Zitat:
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 |
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.
|
Re: UnicodeKonverter
Zitat:
|
Re: UnicodeKonverter
Als Anregung:
Ich verwende zum Tauschen der Byte Order folgende Funktion:
Delphi-Quellcode:
Beim byteweisen Einlesen sehe ich Performanceprobleme.
// 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; Ich lese UFT16 direkt auf einen WideString ein. Wenn die BOM = $FFFE ist dann wird obige Procedure aufgerufen. |
Re: UnicodeKonverter
Hallo zusammen,
@shmia
Delphi-Quellcode:
So weit ich sehen, werden hier 16 Bit auf einmal eingelesen, aber du hast recht, das schnellste wird wohl nicht sein.
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; Einen WideString wollte ich bewusst nicht verwenden, da ich in einem Charakter einen ganzen Unicode-Buchstaben unterzukriegen will. @xZise
Delphi-Quellcode:
Hieran liegt es, oder?
type TUniCharBuffer = packed array[0..(high(TSize) div SizeOf(TUniChar) -1)] of TUniChar;
Probiers so:
Delphi-Quellcode:
(2147483648 = 2 GByte)
type TUniCharBuffer = packed array[0..(2147483648 div SizeOf(TUniChar) -1)] of TUniChar;
Für dein ![]() MfG, Bug |
Re: UnicodeKonverter
Nutze doch sonst einfach die Konstante
![]() |
Re: UnicodeKonverter
Zitat:
Aber z.Zt. mach die Funktion Probleme:
Delphi-Quellcode:
Und zwar bleibt er da hängen.
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; 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; |
Re: UnicodeKonverter
Zitat:
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 09:55 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