1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
| ///////////////////////////////////////////////////////////////////////////
// //
// Copyright (c) 2015 by Charta Software B.V. //
// All rights reserved //
// //
// Version: 1.7.0.83525 //
// Web site: https://pascal.chartasoftware.com/ //
// //
// This code and information are provided "as is" without warranty of //
// any kind. Dissemination of this information or reproduction of //
// this material is strictly forbidden unless prior written permission //
// is obtained from Charta Software B.V.. //
// //
///////////////////////////////////////////////////////////////////////////
unit Character.Encoding;
interface
uses
Boolean,
Character,
Character.String_,
Stream.Input,
Stream.Output;
type
TCharacterEncoding = class(TObject)
private
FIdentifier: TString;
public
constructor Create(const Identifier: TString); virtual;
function Supports(CodePoint: TCharacterCodePoint): TBoolean; virtual; abstract;
procedure Encode(Stream: TOutputStream; CodePoint: TCharacterCodePoint); virtual; abstract;
function Decode(Stream: TInputStream): TCharacterCodePoint; virtual; abstract;
function IsConcatenatable(): TBoolean; virtual;
function Equal(Encoding: TCharacterEncoding): TBoolean;
property Identifier: TString read FIdentifier;
private
class var
Initialized: TBoolean;
class procedure Initialize();
public
class var
Iso8859_1: TCharacterEncoding;
Utf8: TCharacterEncoding;
Utf16LittleEndian: TCharacterEncoding;
Utf16BigEndian: TCharacterEncoding;
UsAscii: TCharacterEncoding;
Windows1252: TCharacterEncoding;
Ia5: TCharacterEncoding;
class procedure AssureInitialized();
class procedure Finalize();
class function FromText(const Identifier: TString): TCharacterEncoding;
end;
implementation
uses
Character.Encoding.Iso._8859_1,
Character.Encoding.UnitedStatesAscii,
Character.Encoding.Utf._16,
Character.Encoding.Utf._8,
Character.Encoding.Windows._1252,
Text.Collation;
{ TCharacterEncoding }
class procedure TCharacterEncoding.AssureInitialized();
begin
if not Initialized then
begin
Initialize();
Initialized := True;
end;
end;
constructor TCharacterEncoding.Create(const Identifier: TString);
begin
inherited Create();
FIdentifier := Identifier;
end;
function TCharacterEncoding.Equal(Encoding: TCharacterEncoding): TBoolean;
begin
Result := (Self = Encoding) or TTextCollation.DefaultCaseInsensitive.Equal(Identifier, Encoding.Identifier);
end;
class procedure TCharacterEncoding.Finalize();
begin
Iso8859_1.Free();
Utf8.Free();
Utf16LittleEndian.Free();
Utf16BigEndian.Free();
UsAscii.Free();
Windows1252.Free();
end;
class function TCharacterEncoding.FromText(const Identifier: TString): TCharacterEncoding;
begin
if TTextCollation.DefaultCaseInsensitive.Equal(Identifier, Iso8859_1.Identifier) then
Result := Iso8859_1
else if TTextCollation.DefaultCaseInsensitive.Equal(Identifier, Utf8.Identifier) then
Result := Utf8
else if TTextCollation.DefaultCaseInsensitive.Equal(Identifier, Utf16LittleEndian.Identifier) then
Result := Utf16LittleEndian
else if TTextCollation.DefaultCaseInsensitive.Equal(Identifier, Utf16BigEndian.Identifier) then
Result := Utf16BigEndian
else if TTextCollation.DefaultCaseInsensitive.Equal(Identifier, UsAscii.Identifier) then
Result := UsAscii
else if TTextCollation.DefaultCaseInsensitive.Equal(Identifier, Windows1252.Identifier) then
Result := Windows1252
else
Result := nil;
end;
class procedure TCharacterEncoding.Initialize();
begin
TIso8859_1.AssureInitialized();
TWindows1252.AssureInitialized();
Iso8859_1 := TIso8859_1.Create('ISO-8859-1');
Utf8 := TUtf8.Create('UTF-8');
Utf16LittleEndian := TUtf16LittleEndian.Create('UTF-16LE');
Utf16BigEndian := TUtf16BigEndian.Create('UTF-16BE');
UsAscii := TUnitedStatesAscii.Create('US-ASCII');
Windows1252 := TWindows1252.Create('WINDOWS-1252');
Ia5 := UsAscii;
end;
function TCharacterEncoding.IsConcatenatable(): TBoolean;
begin
Result := True;
end;
initialization
TCharacterEncoding.AssureInitialized();
finalization
TCharacterEncoding.Finalize();
end.
|