Drei Probleme hier: 1. Dein Selektor hat einen anderen Typ als deine Labels. Irgendwas wird hier also implizit gecastet. Dürfte der Compiler auch anmerken. Spoiler: Wie man gleich sieht, werden deine AnsiChar-Labels implizit auf den WideChar-Typ des Selektors gecastet.
2. Zeichenkonstanten sind
nicht so, wie man sich das vorstellt. Der Compiler castet nun also deine CP1252-Codepoints in den Labels auf UTF-16-Codepoints, um sie mit dem UTF-16-Codepoint im Selektor zu vergleichen. Das sieht dann so aus:
Delphi-Quellcode:
for i := 1 to lStr.Length do
begin
case Ord(lStr[i]) of
0 .. 44 : ;
45 : ;
46 .. 47 : ;
48 .. 57 : ;
58 .. 64 : ;
65 .. 90 : ;
91 .. 96 : ;
97 .. 122 : ;
123 .. 8240 : ;
352 : ; // Hier der Fehler, 352 ist ja bereits in 123..8240 abgedeckt
end;
end;
Würden wir bis #138 zählen (statt #137) sieht es anders aus:
Delphi-Quellcode:
for i := 1 to lStr.Length do
begin
case Ord(lStr[i]) of
0 .. 44 : ;
45 : ;
46 .. 47 : ;
48 .. 57 : ;
58 .. 64 : ;
65 .. 90 : ;
91 .. 96 : ;
97 .. 122 : ;
123 .. 352: ; // Hier KEIN Fehler
end;
end;
3. #129 und vier weitere können nicht auf WideChar gecastet werden.
Also bitte in Case-Anweisungen keine Äpfel mit Birnen vergleichen und überhaupt Strings nicht als Ersatz für
TBytes verwenden. Wenn's unbedingt sein muss, je nach Situation AnsiString oder RawByteString verwenden.