zub врёт - смотря что ты хочешь определить.
чтоб сделать заключение мало инфы - в какой кодировке исходниики?
zamtmn@desktop:~/tmp$ ./project1
9
9
zamtmn@desktop:~/tmp$ ./project1
9
9
на 2.6 глянуть к сожалению немогу, вот вывод примера для 2.7.1 первый с директивой, второй без, исходник в utf8 - не врет.
Для Length нету разницы сколько символов - он возвращает в байтах всегда (для утф16 в парахбайт), SizeOf нужен только чтоб отличить стринг от юникодестринг, механизм полностью аналогичен вычислению объема динамического массива, то что символы переменной длинны - безразницы
Добавлено спустя 51 минуту 23 секунды:предлагаю чуток модернизировать програмку чтоб показывала что сидит внутри строки. исходник сошряняем в utf8 без бом:
- Код: Выделить всё
program project1;
{$CodePage UTF8}
uses
SysUtils;
var
s: string;
i:integer;
pb:pbyte;
begin
s := 'йцы123';
WriteLN('Length(s)='+inttostr(Length(s)));
WriteLN('SizeOf(s[1])='+inttostr(SizeOf(s[1])));
WriteLN('(@(s[1])-p)^='+IntToStr(PLongint(@(s[1])-sizeof(pointer))^));
writeln('s[i]:');
for i:=1 to length(s) do
write(inttostr(ord(s[i]))+';');
writeln(#13#10'Bytes:');
pb:=@s[1];
for i:=1 to Length(s) * SizeOf(s[1]) do
begin
write(inttostr(pb^)+';');
inc(pb);
end;
end.
вывод на 2.7.1 с директивой и без не отличается и вызлядит так:
zamtmn@desktop:~/tmp$ ./project1
Length(s)=9
SizeOf(s[1])=1
(@(s[1])-p)^=9
s[i]:
208;185;209;134;209;139;49;50;51;
Bytes:
208;185;209;134;209;139;49;50;51;
меняем string на unicodestring:
вывод без директивы:
zamtmn@desktop:~/tmp$ ./project1
Length(s)=9
SizeOf(s[1])=2
(@(s[1])-p)^=9
s[i]:
208;185;209;134;209;139;49;50;51;
Bytes:
208;0;185;0;209;0;134;0;209;0;139;0;49;0;50;0;51;0;
вывод с директивой:
zamtmn@desktop:~/tmp$ ./project1
Length(s)=6
SizeOf(s[1])=2
(@(s[1])-p)^=6
s[i]:
1081;1094;1099;49;50;51;
Bytes:
57;4;70;4;75;4;49;0;50;0;51;0;
ИМХО всё логично. директива {$CodePage UTF8} (или BOM в файле) указывает компилятору кодировку исходников, на основе нее компилятор перекодирует строки в исходниках в свою внутренюю кодировку, либо оставляет как есть. length`у и sizeof`у до лампочки символы, они оперируют байтами и словами для utf8 и utf16 соответственно. Разве в 2.6.3 не так?