|
@@ -354,9 +354,11 @@ begin
|
|
|
Error(SErrInvalidCharacter, [CurRow,CurColumn,FTokenStr[0]]);
|
|
|
end;
|
|
|
end;
|
|
|
- // ToDo: 4-bytes UTF16
|
|
|
if u1<>0 then
|
|
|
begin
|
|
|
+ // 4bytes, compose.
|
|
|
+ if not ((u2>=$DC00) and (u2<=$DFFF)) then
|
|
|
+ Error(SErrInvalidCharacter, [CurRow,CurColumn,IntToStr(u2)]);
|
|
|
if (joUTF8 in Options) or (DefaultSystemCodePage=CP_UTF8) then
|
|
|
S:=Utf8Encode(WideString(WideChar(u1)+WideChar(u2))) // ToDo: use faster function
|
|
|
else
|
|
@@ -365,9 +367,23 @@ begin
|
|
|
end
|
|
|
else
|
|
|
begin
|
|
|
- S:='';
|
|
|
- u1:=u2;
|
|
|
- end
|
|
|
+ // Surrogate start
|
|
|
+ if (u2>=$D800) and (U2<=$DBFF) then
|
|
|
+ begin
|
|
|
+ u1:=u2;
|
|
|
+ S:='';
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ if (joUTF8 in Options) or (DefaultSystemCodePage=CP_UTF8) then
|
|
|
+ S:=Utf8Encode(WideString(WideChar(u2))) // ToDo: use faster function
|
|
|
+ else
|
|
|
+ S:=String(WideChar(u1))+String(WideChar(u2)); // WideChar converts the encoding. Should it warn on loss?
|
|
|
+ U1:=0;
|
|
|
+ U2:=0;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ Writeln(' U2 : ',U2,' : >',S,'<');
|
|
|
end;
|
|
|
#0 : Error(SErrOpenString,[FCurRow]);
|
|
|
else
|