Да, Delphi имеет разные версии этой функции для работы с разными типами строк и символов (и их комбинаций, т. Е. Существует более двух версий).
Если вы пишете этот простой тест и смотрите накод ассемблера, вы увидите, что на самом деле происходит:
procedure DoTest;
var
s1: AnsiString;
s2: WideString;
begin
SetString(s1, PAnsiChar('Test1'), 3);
SetString(s2, PWideChar('Test1'), 3);
end;
Установите точку останова в конце этой функции и откройте окно разборки (Ctrl + Alt + D):
Project1.dpr.15: SetString(s1, PAnsiChar('Test1'), 3);
0041BD71 6A00 push $00
0041BD73 BAC0BD4100 mov edx,$0041bdc0
0041BD78 8D45FC lea eax,[ebp-$04]
0041BD7B B903000000 mov ecx,$00000003
0041BD80 E817B7FEFF call @LStrFromPCharLen ; <-- called AnsiString version
Project1.dpr.16: SetString(s2, PWideChar('Test1'), 3);
0041BD85 BAC8BD4100 mov edx,$0041bdc8
0041BD8A 8D45F8 lea eax,[ebp-$08]
0041BD8D B903000000 mov ecx,$00000003
0041BD92 E8E1B6FEFF call @WStrFromPWCharLen ; <-- called WideString version