mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-08 17:48:01 +02:00
106 lines
2.4 KiB
ObjectPascal
106 lines
2.4 KiB
ObjectPascal
// to have correct test result with delphi set codepage option to 65001
|
|
program tcpstr17;
|
|
{$ifdef go32v2}
|
|
{$define USE_INTERNAL_UNICODE}
|
|
{$endif}
|
|
|
|
{$ifdef USE_INTERNAL_UNICODE}
|
|
{$define USE_FPWIDESTRING_UNIT}
|
|
{$define USE_UNICODEDUCET_UNIT}
|
|
{$define USE_CPALL_UNIT}
|
|
{$endif}
|
|
|
|
{$ifdef FPC}
|
|
{$mode delphi}
|
|
{$codepage utf8}
|
|
{$endif}
|
|
{$apptype console}
|
|
|
|
{$ifndef USE_INTERNAL_UNICODE}
|
|
{$ifdef unix}
|
|
uses
|
|
{$ifdef darwin}iosxwstr{$else}cwstring{$endif};
|
|
{$endif unix}
|
|
{$else def USE_INTERNAL_UNICODE}
|
|
uses
|
|
{$ifdef USE_UNICODEDUCET_UNIT}
|
|
unicodeducet,
|
|
{$endif}
|
|
{$ifdef USE_FPWIDESTRING_UNIT}
|
|
fpwidestring,
|
|
{$endif}
|
|
{$ifdef USE_CPALL_UNIT}
|
|
cpall,
|
|
{$endif}
|
|
{ The unit strings is not really used here,
|
|
but simpifies the conditional construction
|
|
for fpwidestring and unicodeducet use }
|
|
strings;
|
|
{$endif def USE_INTERNAL_UNICODE}
|
|
|
|
const
|
|
{$ifdef android}
|
|
OemCP = 1251;
|
|
{$else}
|
|
OemCP = 866;
|
|
{$endif}
|
|
|
|
type
|
|
TOEMStr = type AnsiString(OemCP);
|
|
{$ifndef FPC}
|
|
TSystemCodePage = Word;
|
|
const
|
|
CP_UTF8 = 65001;
|
|
{$endif}
|
|
|
|
procedure TestCodeConvRaw(const s: rawbytestring; const CodePage: TSystemCodePage);
|
|
begin
|
|
WriteLn(StringCodePage(s), ' ',s);
|
|
if CodePage <> StringCodePage(s) then
|
|
halt(1);
|
|
end;
|
|
|
|
procedure TestCodeConvAnsi(const s: ansistring; const CodePage: TSystemCodePage);
|
|
begin
|
|
WriteLn(StringCodePage(s), ' ',s);
|
|
if CodePage <> StringCodePage(s) then
|
|
halt(2);
|
|
end;
|
|
|
|
procedure TestCodeConvUTF(const s: utf8string; const CodePage: TSystemCodePage);
|
|
begin
|
|
WriteLn(StringCodePage(s), ' ',s);
|
|
if CodePage <> StringCodePage(s) then
|
|
halt(3);
|
|
end;
|
|
|
|
var
|
|
u: unicodestring;
|
|
u8: utf8string;
|
|
s: ansistring;
|
|
oemstr: TOEMStr;
|
|
begin
|
|
u := #$0141#$00F3#$0064#$017A;
|
|
u8 := u;
|
|
TestCodeConvRaw(u8, CP_UTF8);
|
|
// if UTF8 codepage is set in options S will have UTF8 codepage
|
|
s := u8;
|
|
TestCodeConvRaw(s, CP_UTF8);
|
|
TestCodeConvAnsi(u8, CP_UTF8);
|
|
TestCodeConvAnsi(s, CP_UTF8);
|
|
// converts to OemCP
|
|
oemstr := u8;
|
|
TestCodeConvRaw(oemstr, OemCP);
|
|
TestCodeConvAnsi(oemstr, DefaultSystemCodePage);
|
|
s := 'test';
|
|
TestCodeConvRaw(s, CP_UTF8);
|
|
// converts to System codepage
|
|
s := oemstr;
|
|
TestCodeConvRaw(s, DefaultSystemCodePage);
|
|
TestCodeConvUTF(s, DefaultSystemCodePage);
|
|
// outputs in source codepage instead of OEM
|
|
TestCodeConvRaw('привет', CP_UTF8);
|
|
// outputs in OEM codepage
|
|
TestCodeConvRaw(TOEMStr('привет'), OemCP);
|
|
end.
|