Registriert seit: 8. Jan 2007
482 Beiträge
|
AW: Wie kann man diesen Code optimieren
10. Apr 2025, 18:38
Gibt es etwas, was alles schneller entfernt?
Delphi-Quellcode:
function CleanUpWinAnsiText(const pmcOriginalText: String; var pmvNormalizedText: String): Integer;
const
UNWANTED_CHARS: set of AnsiChar = [
' ', '-', Chr(151), '_', ':', ';', ',', '.', '!', ''''];
WINANSI_CHAR_MAP: array[Byte] of AnsiChar = (
#0, #1, #2, #3, #4, #5, #6, #7, #8, #9, #10, #11, #12, #13, #14, #15,
#16, #17, #18, #19, #20, #21, #22, #23, #24, #25, #26, #27, #28, #29, #30, #31,
' ', '!', '"', '#', '$', '%', '&', '''', '(', ')', '*', '+', ',', '-', '.', '/',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?',
// Zeile 5: Großbuchstaben nach Kleinbuchstaben (64-79)
'@', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
// Zeile 6: Großbuchstaben nach Kleinbuchstaben (80-95)
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '[', '\', ']', '^', '_',
'`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', #127,
#128, #129, #130, #131, #132, #133, #134, #135, #136, #137, #138, #139, #140, #141, #142, #143,
#144, #145, #146, #147, #148, #149, #150, #151, #152, #153, #154, #155, #156, #157, #158, #159,
// Zeile 11: Umlaute (160-175)
'a', 'u', 'a', 'o', 'a', 'u', 'o', 'a', 'o', 'a', 'o', 'a', 'a', 'a', 'a', 'a',
// Zeile 12: Umlaute (176-191)
'c', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'a', 'a', 'a', 'a', 'e', 'e', 'e', 'e',
// Zeile 13: Sonderzeichen und Umlaute (192-207)
'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'y', 'y', 's', 'd', 'd', 'd',
#208, #209, #210, #211, #212, #213, #214, 'o', #216, #217, #218, #219, 'u', #221, #222, #223,
'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o',
'u', 'u', 'u', 'u', 'y', 'y', 'y', 'y', #252, #253, #254, #255, 'a', 'a', 'o', 'o'
);
var
p: PChar;
idx: Integer;
begin
if pmcOriginalText = '' then
begin
pmvNormalizedText := '';
Exit(0);
end;
Result := Length(pmcOriginalText);
SetString(pmvNormalizedText, PChar(Pointer(pmcOriginalText)), Result);
p := Pointer(pmvNormalizedText);
for idx := 1 to Result do
begin
if not (pmcOriginalText[idx] in UNWANTED_CHARS) then
begin
PByte(p)^ := Byte(WINANSI_CHAR_MAP[Ord(pmcOriginalText[idx])]);
PByte(p + 1)^ := 0;
Inc(p);
end;
end;
Result := p - Pointer(pmvNormalizedText);
SetLength(pmvNormalizedText, Result);
end;
Keine Gewähr! Den WINANSI_CHAR_MAP habe ich von Copilot nach folgenden Regeln erstellen lassen: - Alle Großbuchstaben werden in die entsprechenden Kleinbuchstaben umgewandelt.
- Alle Umlaute werden in ihre Grundform umgewandelt (ä -> a, Ä -> a, ö -> o, Ö -> o, ü -> u, Ü -> u, ß -> s).
- Alle anderen Zeichen bleiben unverändert und entsprechen ihrer Definition im ANSI-Zeichensatz.
- Die Tabelle ist strukturiert mit 16 Zeichen pro Zeile und 16 Zeilen insgesamt, um den kompletten Bereich von 256 Zeichen abzudecken.
Bis bald...
Thomas
|