tencodingtest.pp 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. program tencodingtest;
  2. {$mode delphi}{$H+}
  3. {$codepage cp1251}
  4. uses
  5. SysUtils, Classes;
  6. function CheckCodePage(const B: TBytes; AEncoding: TEncoding): Boolean;
  7. var
  8. DetectedEncoding: TEncoding;
  9. begin
  10. DetectedEncoding := nil;
  11. Result :=
  12. (TEncoding.GetBufferEncoding(B, DetectedEncoding) <> 0) and
  13. (DetectedEncoding = AEncoding);
  14. end;
  15. const
  16. UTF8Bytes: array[0..18] of byte = ($EF,$BB,$BF,$D0,$9F,$D1,$80,$D0,$BE,$D0,$B2,$D0,$B5,$D1,$80,$D0,$BA,$D0,$B0);
  17. UTF16Bytes: array[0..17] of byte = ($FF,$FE,$1F,$04,$40,$04,$3E,$04,$32,$04,$35,$04,$40,$04,$3A,$04,$30,$04);
  18. UTF16BEBytes: array[0..17] of byte = ($FE,$FF,$04,$1F,$04,$40,$04,$3E,$04,$32,$04,$35,$04,$40,$04,$3A,$04,$30);
  19. type
  20. TCp1251String = type AnsiString(1251);
  21. TCp866String = type AnsiString(866);
  22. var
  23. Cp866Encoding,
  24. Cp1251Encoding: TEncoding;
  25. Bytes: TBytes;
  26. Cp1251String: TCp1251String;
  27. Cp866String: Tcp866String;
  28. S: AnsiString;
  29. U8: UTF8String;
  30. U1, U2: UnicodeString;
  31. begin
  32. // 1. check various conversions
  33. Cp866Encoding := TEncoding.GetEncoding('IBM866');
  34. Cp1251Encoding := TEncoding.GetEncoding('windows-1251');
  35. Cp1251String := 'Ïðèâåò çåìëÿíå!';
  36. Cp866String := Cp1251String;
  37. Bytes := Cp1251Encoding.GetBytes(Cp1251String);
  38. Bytes := TEncoding.Convert(Cp1251Encoding, Cp866Encoding, Bytes);
  39. SetString(S, PAnsiChar(Bytes), Length(Bytes));
  40. if not CompareMem(Pointer(S), Pointer(Cp866String), Length(S)) then
  41. halt(1);
  42. if StringCodePage(S)<>DefaultSystemCodePage then
  43. halt(11);
  44. SetString(Cp1251String,pchar(Cp1251String),length(Cp1251String));
  45. if StringCodePage(Cp1251String)<>1251 then
  46. halt(12);
  47. U1 := Cp866Encoding.GetString(Bytes);
  48. U2 := TEncoding.Unicode.GetString(TEncoding.Convert(Cp866Encoding, TEncoding.Unicode, Bytes));
  49. if U1 <> U2 then
  50. halt(2);
  51. U1 := TEncoding.BigEndianUnicode.GetString(TEncoding.Convert(Cp866Encoding, TEncoding.BigEndianUnicode, Bytes));
  52. if U1 <> U2 then
  53. halt(3);
  54. Bytes := TEncoding.Convert(Cp866Encoding, TEncoding.UTF8, Bytes);
  55. U8 := Cp866String;
  56. if not CompareMem(Pointer(U8), @Bytes[0], Length(U8)) then
  57. halt(4);
  58. // 2. check misc functions
  59. if not (TEncoding.IsStandardEncoding(TEncoding.Unicode) or TEncoding.IsStandardEncoding(TEncoding.UTF8) or TEncoding.IsStandardEncoding(TEncoding.UTF7)) or
  60. TEncoding.IsStandardEncoding(Cp866Encoding) or TEncoding.IsStandardEncoding(Cp1251Encoding) then
  61. halt(5);
  62. if Cp866Encoding.EncodingName = '' then
  63. halt(6)
  64. else
  65. WriteLn(Cp866Encoding.EncodingName);
  66. if TEncoding.Default.CodePage <> DefaultSystemCodePage then
  67. halt(7);
  68. // 3. check codepage detection
  69. SetLength(Bytes, Length(UTF8Bytes));
  70. Move(UTF8Bytes[0], Bytes[0], Length(UTF8Bytes));
  71. if not CheckCodePage(Bytes, TEncoding.UTF8) then
  72. halt(8);
  73. SetLength(Bytes, Length(UTF16Bytes));
  74. Move(UTF16Bytes[0], Bytes[0], Length(UTF16Bytes));
  75. if not CheckCodePage(Bytes, TEncoding.Unicode) then
  76. halt(9);
  77. SetLength(Bytes, Length(UTF16BEBytes));
  78. Move(UTF16BEBytes[0], Bytes[0], Length(UTF16BEBytes));
  79. if not CheckCodePage(Bytes, TEncoding.BigEndianUnicode) then
  80. halt(10);
  81. Cp866Encoding.Free;
  82. Cp1251Encoding.Free;
  83. WriteLn('ok');
  84. end.