Vielleicht denke ich zu simpel, aber würde es für
Ansi nicht auch einfach so gehen (die nicht darstellbaren Zeichen habe ich bewusst nicht herausgefiltert)?
Delphi-Quellcode:
type
TCharCounter = class
private
FCounts: array [AnsiChar] of Cardinal;
FTotal: int64;
public
procedure ReadString(const s: AnsiString);
function GetCount(c: AnsiChar): integer;
function GetPercentage(c: AnsiChar): single;
constructor Create;
end;
constructor TCharCounter.Create;
begin
FillChar(FCounts, SizeOf(FCounts), 0);
end;
function TCharCounter.GetCount(c: AnsiChar): integer;
begin
Result := FCounts[c];
end;
function TCharCounter.GetPercentage(c: AnsiChar): single;
begin
if FTotal = 0 then
Result := 0
else
Result := GetCount(c) / FTotal * 100;
end;
procedure TCharCounter.ReadString(const s: AnsiString);
var
i: Cardinal;
begin
FTotal := 0;
for i := Low(s) to High(s) do
begin
FCounts[s[i]] := FCounts[s[i]] + 1;
inc(FTotal);
end;
end;