Nuja, zum Beispiel tritt in dieser Funktion ein E2010: Inkompatible Typen - Fehler auf.
Delphi-Quellcode:
FUNCTION Utf8ToAnsi (Source :
STRING; UnknownChar : CHAR = '
¿') : ANSISTRING;
// <- Result: AnsiString
(* Converts the given UTF-8 String to Windows ANSI (Win-1252).
If a character can not be converted, the "UnknownChar" is inserted. *)
VAR
SourceLen : INTEGER;
// Length of Source string
I, K : INTEGER;
A : BYTE;
// Current ANSI character value
U : WORD;
Ch : CHAR;
// Dest char
Len : INTEGER;
// Current real length of "Result" string
BEGIN
SourceLen := Length (Source);
SetLength (Result, SourceLen);
// Enough room to live
Len := 0;
I := 1;
WHILE I <= SourceLen
DO BEGIN
A := ORD (Source [I]);
IF A < $80
THEN BEGIN // Range $0000..$007F
INC (Len);
Result [Len] := Source [I];
// ---> Fehlermeldung: E2010: Inkompatible Typen: AnsiChar und Char (Source : String, Result : AnsiString)
INC (I);
END
ELSE BEGIN // Determine U, Inc I
IF (A
AND $E0 = $C0)
AND (I < SourceLen)
THEN BEGIN // Range $0080..$07FF
U := (WORD (A
AND $1F)
SHL 6)
OR (ORD (Source [I+1])
AND $3F);
INC (I, 2);
END
ELSE IF (A
AND $F0 = $E0)
AND (I < SourceLen-1)
THEN BEGIN // Range $0800..$FFFF
U := (WORD (A
AND $0F)
SHL 12)
OR
(WORD (ORD (Source [I+1])
AND $3F)
SHL 6)
OR
( ORD (Source [I+2])
AND $3F);
INC (I, 3);
END
ELSE BEGIN // Unknown/unsupported
INC (I);
FOR K := 7
DOWNTO 0
DO
IF A
AND (1
SHL K) = 0
THEN BEGIN
INC (I, (A
SHR (K+1))-1);
BREAK;
END;
U := WIN1252_UNICODE [ORD (UnknownChar)];
END;
Ch := UnknownChar;
// Retrieve ANSI char
FOR A := $00
TO $FF
DO
IF WIN1252_UNICODE [A] = U
THEN BEGIN
Ch := CHR (A);
BREAK;
END;
INC (Len);
Result [Len] := Ch;
// ---> Fehlermeldung: E2010: Inkompatible Typen: AnsiChar und Char (Ch : Char , Result : AnsiString)
END;
END;
SetLength (Result, Len);
END;
Hier stellt sich nun die Frage, ob man die Funktionen (gibts auch rückwärts, die ist aber fehlerfrei)
überhaupt noch benötigt.
Hab mich mit dem Code noch nicht eingehend befasst, wollte das eben auch möglichst vermeiden.
Aber anscheinend sind alle Äpfel sauer, in die ich hier beissen kann.
@mjustin: Danke mal für die Alternativen
Allerdings kommen beide für mich nicht in Frage, da der Einsatz sich auf einige wenige Zugriffe beschränkt und der Preis somit
kaum zu rechtfertigen ist.
Make me a sandwich! - What? Make it yourself. - Sudo make me a sandwich! - Okay