UTF-8 setzt auf
ASCII auf, nicht auf
ANSI (Windows-1252/Latin-1).
Unicode setzt auf Latin-1 auf.
UTF-16 ist aber auch ein Multi-Byte-Zeichensatz. Mal 2 und mal 4 Bytes.
Für Delphi könnte man das so machen:
Delphi-Quellcode:
function RealLength(s: string): Integer;
var
c: Char;
begin
Result := 0;
for c in s do
case Ord(c) of
$D800..$DBFF: Continue; // High Surrogate, man könnte auch genau so gut Low Surrogate nehmen, Hauptsache man nimmt nur eins von beiden
else inc(Result);
end;
end;