tissurrogatepair2.pp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. program tissurrogatepair2;
  2. {$ifdef FPC}
  3. {$mode objfpc}
  4. {$H+}
  5. {$PACKENUM 1}
  6. {$endif fpc}
  7. {$ifndef FPC}
  8. {$APPTYPE CONSOLE}
  9. {$endif}
  10. uses
  11. SysUtils,
  12. character;
  13. {$ifndef FPC}
  14. type UnicodeChar = WideChar;
  15. {$endif}
  16. procedure DoError(ACode : Integer; ACodePoint1, ACodePoint2 : Integer); overload;
  17. begin
  18. WriteLn(
  19. 'Error #',ACode,
  20. ' ; CodePoint1 = ',IntToHex(ACodePoint1,4),
  21. ' ; CodePoint2 = ',IntToHex(ACodePoint2,4)
  22. );
  23. Halt(Acode);
  24. end;
  25. const
  26. LOW_SURROGATE_BEGIN = Word($DC00);
  27. LOW_SURROGATE_END = Word($DFFF);
  28. HIGH_SURROGATE_BEGIN = Word($D800);
  29. HIGH_SURROGATE_END = Word($DBFF);
  30. var
  31. e, i , j: Integer;
  32. s : UnicodeString;
  33. begin
  34. s := 'azerty12345';
  35. e := 1;
  36. for i := HIGH_SURROGATE_BEGIN to HIGH_SURROGATE_END do begin
  37. for j := LOW_SURROGATE_BEGIN to LOW_SURROGATE_END do begin
  38. s[3] := UnicodeChar(i);
  39. s[4] := UnicodeChar(j);
  40. if not TCharacter.IsSurrogatePair(s,3) then
  41. DoError(e,i,j);
  42. end;
  43. end;
  44. Inc(e);
  45. for i := Low(Word) to High(Word) do begin
  46. if (i < HIGH_SURROGATE_BEGIN) or (i > HIGH_SURROGATE_END) then begin
  47. for j := Low(Word) to High(Word) do begin
  48. if (j < LOW_SURROGATE_BEGIN) or (j > LOW_SURROGATE_END) then begin
  49. s[5] := UnicodeChar(i);
  50. s[6] := UnicodeChar(j);
  51. if TCharacter.IsSurrogatePair(s,5) then
  52. DoError(e,i,j);
  53. end;
  54. end;
  55. end;
  56. end;
  57. WriteLn('ok');
  58. end.