Einzelnen Beitrag anzeigen

mytbo

Registriert seit: 8. Jan 2007
482 Beiträge
 
#11

AW: Wie kann man diesen Code optimieren

  Alt 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
  Mit Zitat antworten Zitat