Menu

[r751]: / branches / revised-webservices / Src / NsWebServices.UCharEncodings.pas  Maximize  Restore  History

Download this file

191 lines (171 with data), 5.7 kB

  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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
{
* NsWebServices.UCharEncodings.pas
*
* Implements a class that defines and provides access to character sets and
* encodings supported when accessing web services.
*
* $Rev$
* $Date$
*
* ***** BEGIN LICENSE BLOCK *****
*
* Version: MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The Original Code is NsWebServices.UCharEncodings.pas
*
* The Initial Developer of the Original Code is Peter Johnson
* (http://www.delphidabbler.com/).
*
* Portions created by the Initial Developer are Copyright (C) 2010 Peter
* Johnson. All Rights Reserved.
*
* Contributor(s)
* NONE
*
* ***** END LICENSE BLOCK *****
}
unit NsWebServices.UCharEncodings;
interface
uses
SysUtils,
UBaseObjects;
type
// Class of exception raised by TWSCharEncodings
EWSCharEncodings = class(Exception);
TWSCharEncodings = class(TNoConstructObject)
strict private
type
// Maps an encoding by name onto a representative code
TCharEncoding = record
public
Name: string; // name of encoding, e.g. ISO-8859-1 or UTF-8
Code: Word; // code page or id if encoding is not ANSI
constructor Create(const AName: string; const ACode: Word);
end;
// constants used to identify encodings that map to predefined encodings of
// TEncoding
const UTF8CodePage = 65001;
const ASCIICodePage = 20127;
const UTF16LECodePage = $FFFE; // not ANSI => no code page: use BOM instead
const UTF16BECodePage = $FEFF; // not ANSI => no code page: use BOM instead
// value used when code page not recognised
const ErrorCodePage = 0;
// default encoding to use if none specified
const DefaultEncoding = 'ISO-8859-1';
// supported encodings
class var fEncodings: array of TCharEncoding;
class function IndexOf(const CharSet: string): Integer;
class function CharCode(CharSet: string): Word;
public
class constructor Create;
class destructor Destroy;
class function Supported(const CharSet: string): Boolean;
{Checks if a character set is supported.
@param CharSet [in] String specifying character set. '' is interpreted
as DefaultEncoding.
@return True if character set is supported, False if not.
}
class function GetEncoding(const CharSet: string): TEncoding;
{Creates an encoding for a character set. Call must free the encoding if
it is not a default encoding.
@param CharSet [in] String specifying character set. '' is interpreted
as DefaultEncoding.
@return Appropriate encoding instance.
@except Raises EWSCharEncodings if CharSet is not supported.
}
class function AcceptCharSet: string;
{Returns comma separated list of accepted character sets suitable for
inclusion in http headers.
@return Required list.
}
end;
implementation
{ TWSCharEncodings }
class function TWSCharEncodings.AcceptCharSet: string;
var
Idx: Integer;
begin
Result := '';
for Idx := Low(fEncodings) to High(fEncodings) do
begin
if Result <> '' then
Result := Result + ', ';
Result := Result + fEncodings[Idx].Name;
end;
end;
class function TWSCharEncodings.CharCode(CharSet: string): Word;
var
Idx: Integer;
begin
if CharSet = '' then
CharSet := DefaultEncoding;
Idx := IndexOf(CharSet);
if Idx >= 0 then
Result := fEncodings[Idx].Code
else
Result := 0
end;
class constructor TWSCharEncodings.Create;
begin
SetLength(fEncodings, 6);
fEncodings[0] := TCharEncoding.Create('UTF-8', UTF8CodePage);
fEncodings[1] := TCharEncoding.Create('UTF-16LE', UTF16LECodePage);
fEncodings[2] := TCharEncoding.Create('UTF-16BE', UTF16BECodePage);
fEncodings[3] := TCharEncoding.Create('ISO-8859-1', 28591); // latin 1
fEncodings[4] := TCharEncoding.Create('Windows-1252', 1252);
fEncodings[5] := TCharEncoding.Create('ASCII', ASCIICodePage);
// NOTE: UTF-16 has been left out because some problems with PHP's
// mb_convert_encoding() with UTF-16 have been found, so it's not safe to
// accept this encoding
end;
class destructor TWSCharEncodings.Destroy;
begin
SetLength(fEncodings, 0);
end;
class function TWSCharEncodings.GetEncoding(const CharSet: string): TEncoding;
resourcestring
sErrorMsg = 'Unsupported Character Encoding: %s';
var
Code: Word;
begin
Code := CharCode(CharSet);
case Code of
ErrorCodePage: raise EWSCharEncodings.CreateFmt(sErrorMsg, [CharSet]);
UTF8CodePage: Exit(TEncoding.UTF8);
UTF16LECodePage: Exit(TEncoding.Unicode);
UTF16BECodePage: Exit(TEncoding.BigEndianUnicode);
ASCIICodePage: Exit(TEncoding.ASCII);
else Exit(TMBCSEncoding.Create(Code));
end;
end;
class function TWSCharEncodings.IndexOf(const CharSet: string): Integer;
var
Idx: Integer;
begin
for Idx := Low(fEncodings) to High(fEncodings) do
begin
if AnsiSameText(fEncodings[Idx].Name, CharSet) then
Exit(Idx);
end;
Exit(-1);
end;
class function TWSCharEncodings.Supported(const CharSet: string): Boolean;
begin
Result := CharCode(CharSet) = ErrorCodePage;
end;
{ TWSCharEncodings.TCharEncoding }
constructor TWSCharEncodings.TCharEncoding.Create(const AName: string;
const ACode: Word);
begin
Name := AName;
Code := ACode;
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.