~ubuntu-branches/ubuntu/saucy/lazarus/saucy

« back to all changes in this revision

Viewing changes to components/lazutils/lazutf16.pas

  • Committer: Package Import Robot
  • Author(s): Paul Gevers, Abou Al Montacir, Bart Martens, Paul Gevers
  • Date: 2013-06-08 14:12:17 UTC
  • mfrom: (1.1.9)
  • Revision ID: package-import@ubuntu.com-20130608141217-7k0cy9id8ifcnutc
Tags: 1.0.8+dfsg-1
[ Abou Al Montacir ]
* New upstream major release and multiple maintenace release offering many
  fixes and new features marking a new milestone for the Lazarus development
  and its stability level.
  - The detailed list of changes can be found here:
    http://wiki.lazarus.freepascal.org/Lazarus_1.0_release_notes
    http://wiki.lazarus.freepascal.org/Lazarus_1.0_fixes_branch
* LCL changes:
  - LCL is now a normal package.
      + Platform independent parts of the LCL are now in the package LCLBase
      + LCL is automatically recompiled when switching the target platform,
        unless pre-compiled binaries for this target are already installed.
      + No impact on existing projects.
      + Linker options needed by LCL are no more added to projects that do
        not use the LCL package.
  - Minor changes in LCL basic classes behaviour
      + TCustomForm.Create raises an exception if a form resource is not
        found.
      + TNotebook and TPage: a new implementation of these classes was added.
      + TDBNavigator: It is now possible to have focusable buttons by setting
        Options = [navFocusableButtons] and TabStop = True, useful for
        accessibility and for devices with neither mouse nor touch screen.
      + Names of TControlBorderSpacing.GetSideSpace and GetSpace were swapped
        and are now consistent. GetSideSpace = Around + GetSpace.
      + TForm.WindowState=wsFullscreen was added
      + TCanvas.TextFitInfo was added to calculate how many characters will
        fit into a specified Width. Useful for word-wrapping calculations.
      + TControl.GetColorResolvingParent and
        TControl.GetRGBColorResolvingParent were added, simplifying the work
        to obtain the final color of the control while resolving clDefault
        and the ParentColor.
      + LCLIntf.GetTextExtentExPoint now has a good default implementation
        which works in any platform not providing a specific implementation.
        However, Widgetset specific implementation is better, when available.
      + TTabControl was reorganized. Now it has the correct class hierarchy
        and inherits from TCustomTabControl as it should.
  - New unit in the LCL:
      + lazdialogs.pas: adds non-native versions of various native dialogs,
        for example TLazOpenDialog, TLazSaveDialog, TLazSelectDirectoryDialog.
        It is used by widgetsets which either do not have a native dialog, or
        do not wish to use it because it is limited. These dialogs can also be
        used by user applications directly.
      + lazdeviceapis.pas: offers an interface to more hardware devices such
        as the accelerometer, GPS, etc. See LazDeviceAPIs
      + lazcanvas.pas: provides a TFPImageCanvas descendent implementing
        drawing in a LCL-compatible way, but 100% in Pascal.
      + lazregions.pas. LazRegions is a wholly Pascal implementation of
        regions for canvas clipping, event clipping, finding in which control
        of a region tree one an event should reach, for drawing polygons, etc.
      + customdrawncontrols.pas, customdrawndrawers.pas,
        customdrawn_common.pas, customdrawn_android.pas and
        customdrawn_winxp.pas: are the Lazarus Custom Drawn Controls -controls
        which imitate the standard LCL ones, but with the difference that they
        are non-native and support skinning.
  - New APIs added to the LCL to improve support of accessibility software
    such as screen readers.
* IDE changes:
  - Many improvments.
  - The detailed list of changes can be found here:
    http://wiki.lazarus.freepascal.org/New_IDE_features_since#v1.0_.282012-08-29.29
    http://wiki.lazarus.freepascal.org/Lazarus_1.0_release_notes#IDE_Changes
* Debugger / Editor changes:
  - Added pascal sources and breakpoints to the disassembler
  - Added threads dialog.
* Components changes:
  - TAChart: many fixes and new features
  - CodeTool: support Delphi style generics and new syntax extensions.
  - AggPas: removed to honor free licencing. (Closes: Bug#708695)
[Bart Martens]
* New debian/watch file fixing issues with upstream RC release.
[Abou Al Montacir]
* Avoid changing files in .pc hidden directory, these are used by quilt for
  internal purpose and could lead to surprises during build.
[Paul Gevers]
* Updated get-orig-source target and it compinion script orig-tar.sh so that they
  repack the source file, allowing bug 708695 to be fixed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
{
 
2
 /***************************************************************************
 
3
                                  lazutf16.pas
 
4
 ***************************************************************************/
 
5
 
 
6
 *****************************************************************************
 
7
 *                                                                           *
 
8
 *  This file is part of LazUtils                                            *
 
9
 *                                                                           *
 
10
 *  See the file COPYING.modifiedLGPL.txt, included in this distribution,    *
 
11
 *  for details about the copyright.                                         *
 
12
 *                                                                           *
 
13
 *  This program is distributed in the hope that it will be useful,          *
 
14
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
 
15
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                     *
 
16
 *                                                                           *
 
17
 *****************************************************************************
 
18
 
 
19
This unit includes string routines which are based on UTF-16 implementations,
 
20
although it might also include routines for other encodings.
 
21
 
 
22
A UTF-16 based implementation for LowerCase, for example, is faster in WideString
 
23
and UnicodeString then the default UTF-8 implementation
 
24
 
 
25
Currently this unit includes only UTF8LowerCaseViaTables which is based on a
 
26
UTF-16 table, but it might be extended to include various UTF-16 routines
 
27
}
 
28
unit lazutf16;
 
29
 
 
30
{$mode objfpc}{$H+}
 
31
 
 
32
interface
 
33
 
 
34
uses
 
35
  Classes, SysUtils, lazutf8;
 
36
 
 
37
function UTF16CharacterLength(p: PWideChar): integer;
 
38
function UTF16Length(const s: widestring): PtrInt;
 
39
function UTF16Length(p: PWideChar; WordCount: PtrInt): PtrInt;
 
40
function UTF16CharacterToUnicode(p: PWideChar; out CharLen: integer): Cardinal;
 
41
function UnicodeToUTF16(u: cardinal): widestring;
 
42
 
 
43
function UnicodeLowercase(u: cardinal): cardinal;
 
44
function UTF8LowerCaseViaTables(const s: string): string;
 
45
 
 
46
implementation
 
47
 
 
48
function UTF16CharacterLength(p: PWideChar): integer;
 
49
// returns length of UTF16 character in number of words
 
50
// The endianess of the machine will be taken.
 
51
begin
 
52
  if p<>nil then begin
 
53
    if (ord(p[0]) < $D800) or (ord(p[0]) > $DFFF) then
 
54
      Result:=1
 
55
    else
 
56
      Result:=2;
 
57
  end else begin
 
58
    Result:=0;
 
59
  end;
 
60
end;
 
61
 
 
62
function UTF16Length(const s: widestring): PtrInt;
 
63
begin
 
64
  Result:=UTF16Length(PWideChar(s),length(s));
 
65
end;
 
66
 
 
67
function UTF16Length(p: PWideChar; WordCount: PtrInt): PtrInt;
 
68
var
 
69
  CharLen: LongInt;
 
70
begin
 
71
  Result:=0;
 
72
  while (WordCount>0) do begin
 
73
    inc(Result);
 
74
    CharLen:=UTF16CharacterLength(p);
 
75
    inc(p,CharLen);
 
76
    dec(WordCount,CharLen);
 
77
  end;
 
78
end;
 
79
 
 
80
function UTF16CharacterToUnicode(p: PWideChar; out CharLen: integer): Cardinal;
 
81
var
 
82
  w1: cardinal;
 
83
  w2: Cardinal;
 
84
begin
 
85
  if p<>nil then begin
 
86
    w1:=ord(p[0]);
 
87
    if (w1 < $D800) or (w1 > $DFFF) then begin
 
88
      // is 1 word character
 
89
      Result:=w1;
 
90
      CharLen:=1;
 
91
    end else begin
 
92
      // could be 2 word character
 
93
      w2:=ord(p[1]);
 
94
      if (w2>=$DC00) then begin
 
95
        // is 2 word character
 
96
        Result:=(w1-$D800) shl 10 + (w2-$DC00) + $10000;
 
97
        CharLen:=2;
 
98
      end else begin
 
99
        // invalid character
 
100
        Result:=w1;
 
101
        CharLen:=1;
 
102
      end;
 
103
    end;
 
104
  end else begin
 
105
    Result:=0;
 
106
    CharLen:=0;
 
107
  end;
 
108
end;
 
109
 
 
110
function UnicodeToUTF16(u: cardinal): widestring;
 
111
begin
 
112
  // u should be <= $10FFFF to fit into UTF-16
 
113
 
 
114
  if u < $10000 then
 
115
    // Note: codepoints $D800 - $DFFF are reserved
 
116
    Result:=system.widechar(u)
 
117
  else
 
118
    Result:=system.widechar($D800+((u - $10000) shr 10))+system.widechar($DC00+((u - $10000) and $3ff));
 
119
end;
 
120
 
 
121
// Lowercase Unicode Tables which match UTF-16 but also UTF-32
 
122
var
 
123
  UnicodeLower00C0_00DE: array[$00C0..$00DE] of word;
 
124
  UnicodeLower0100_024E: array[$0100..$024E] of word;
 
125
  UnicodeLower0386_03AB: array[$0386..$03AB] of word;
 
126
  UnicodeLower03D8_042F: array[$03D8..$042F] of word;
 
127
  UnicodeLower0460_0512: array[$0460..$0512] of word;
 
128
  UnicodeLower1E00_1FFC: array[$1E00..$1FFC] of word;
 
129
  UnicodeLower2126_2183: array[$2126..$2183] of word;
 
130
  UnicodeLower2C60_2CE2: array[$2C60..$2CE2] of word;
 
131
 
 
132
procedure InitUnicodeTables;
 
133
var
 
134
  i: Integer;
 
135
begin
 
136
  for i:=Low(UnicodeLower00C0_00DE) to High(UnicodeLower00C0_00DE) do
 
137
    UnicodeLower00C0_00DE[i]:=i+32;
 
138
  UnicodeLower00C0_00DE[$00D7]:=$00D7;
 
139
 
 
140
  for i:=Low(UnicodeLower0100_024E) to High(UnicodeLower0100_024E) do
 
141
    UnicodeLower0100_024E[i]:=i;
 
142
  UnicodeLower0100_024E[$0100]:=$0101;
 
143
  UnicodeLower0100_024E[$0102]:=$0103;
 
144
  UnicodeLower0100_024E[$0104]:=$0105;
 
145
  UnicodeLower0100_024E[$0106]:=$0107;
 
146
  UnicodeLower0100_024E[$0108]:=$0109;
 
147
  UnicodeLower0100_024E[$010A]:=$010B;
 
148
  UnicodeLower0100_024E[$010C]:=$010D;
 
149
  UnicodeLower0100_024E[$010E]:=$010F;
 
150
  UnicodeLower0100_024E[$0110]:=$0111;
 
151
  UnicodeLower0100_024E[$0112]:=$0113;
 
152
  UnicodeLower0100_024E[$0114]:=$0115;
 
153
  UnicodeLower0100_024E[$0116]:=$0117;
 
154
  UnicodeLower0100_024E[$0118]:=$0119;
 
155
  UnicodeLower0100_024E[$011A]:=$011B;
 
156
  UnicodeLower0100_024E[$011C]:=$011D;
 
157
  UnicodeLower0100_024E[$011E]:=$011F;
 
158
  UnicodeLower0100_024E[$0120]:=$0121;
 
159
  UnicodeLower0100_024E[$0122]:=$0123;
 
160
  UnicodeLower0100_024E[$0124]:=$0125;
 
161
  UnicodeLower0100_024E[$0126]:=$0127;
 
162
  UnicodeLower0100_024E[$0128]:=$0129;
 
163
  UnicodeLower0100_024E[$012A]:=$012B;
 
164
  UnicodeLower0100_024E[$012C]:=$012D;
 
165
  UnicodeLower0100_024E[$012E]:=$012F;
 
166
  UnicodeLower0100_024E[$0130]:=$0069;
 
167
  UnicodeLower0100_024E[$0132]:=$0133;
 
168
  UnicodeLower0100_024E[$0134]:=$0135;
 
169
  UnicodeLower0100_024E[$0136]:=$0137;
 
170
  UnicodeLower0100_024E[$0139]:=$013A;
 
171
  UnicodeLower0100_024E[$013B]:=$013C;
 
172
  UnicodeLower0100_024E[$013D]:=$013E;
 
173
  UnicodeLower0100_024E[$013F]:=$0140;
 
174
  UnicodeLower0100_024E[$0141]:=$0142;
 
175
  UnicodeLower0100_024E[$0143]:=$0144;
 
176
  UnicodeLower0100_024E[$0145]:=$0146;
 
177
  UnicodeLower0100_024E[$0147]:=$0148;
 
178
  UnicodeLower0100_024E[$014A]:=$014B;
 
179
  UnicodeLower0100_024E[$014C]:=$014D;
 
180
  UnicodeLower0100_024E[$014E]:=$014F;
 
181
  UnicodeLower0100_024E[$0150]:=$0151;
 
182
  UnicodeLower0100_024E[$0152]:=$0153;
 
183
  UnicodeLower0100_024E[$0154]:=$0155;
 
184
  UnicodeLower0100_024E[$0156]:=$0157;
 
185
  UnicodeLower0100_024E[$0158]:=$0159;
 
186
  UnicodeLower0100_024E[$015A]:=$015B;
 
187
  UnicodeLower0100_024E[$015C]:=$015D;
 
188
  UnicodeLower0100_024E[$015E]:=$015F;
 
189
  UnicodeLower0100_024E[$0160]:=$0161;
 
190
  UnicodeLower0100_024E[$0162]:=$0163;
 
191
  UnicodeLower0100_024E[$0164]:=$0165;
 
192
  UnicodeLower0100_024E[$0166]:=$0167;
 
193
  UnicodeLower0100_024E[$0168]:=$0169;
 
194
  UnicodeLower0100_024E[$016A]:=$016B;
 
195
  UnicodeLower0100_024E[$016C]:=$016D;
 
196
  UnicodeLower0100_024E[$016E]:=$016F;
 
197
  UnicodeLower0100_024E[$0170]:=$0171;
 
198
  UnicodeLower0100_024E[$0172]:=$0173;
 
199
  UnicodeLower0100_024E[$0174]:=$0175;
 
200
  UnicodeLower0100_024E[$0176]:=$0177;
 
201
  UnicodeLower0100_024E[$0178]:=$00FF;
 
202
  UnicodeLower0100_024E[$0179]:=$017A;
 
203
  UnicodeLower0100_024E[$017B]:=$017C;
 
204
  UnicodeLower0100_024E[$017D]:=$017E;
 
205
  UnicodeLower0100_024E[$0181]:=$0253;
 
206
  UnicodeLower0100_024E[$0182]:=$0183;
 
207
  UnicodeLower0100_024E[$0184]:=$0185;
 
208
  UnicodeLower0100_024E[$0186]:=$0254;
 
209
  UnicodeLower0100_024E[$0187]:=$0188;
 
210
  UnicodeLower0100_024E[$0189]:=$0256;
 
211
  UnicodeLower0100_024E[$018A]:=$0257;
 
212
  UnicodeLower0100_024E[$018B]:=$018C;
 
213
  UnicodeLower0100_024E[$018E]:=$01DD;
 
214
  UnicodeLower0100_024E[$018F]:=$0259;
 
215
  UnicodeLower0100_024E[$0190]:=$025B;
 
216
  UnicodeLower0100_024E[$0191]:=$0192;
 
217
  UnicodeLower0100_024E[$0193]:=$0260;
 
218
  UnicodeLower0100_024E[$0194]:=$0263;
 
219
  UnicodeLower0100_024E[$0196]:=$0269;
 
220
  UnicodeLower0100_024E[$0197]:=$0268;
 
221
  UnicodeLower0100_024E[$0198]:=$0199;
 
222
  UnicodeLower0100_024E[$019C]:=$026F;
 
223
  UnicodeLower0100_024E[$019D]:=$0272;
 
224
  UnicodeLower0100_024E[$019F]:=$0275;
 
225
  UnicodeLower0100_024E[$01A0]:=$01A1;
 
226
  UnicodeLower0100_024E[$01A2]:=$01A3;
 
227
  UnicodeLower0100_024E[$01A4]:=$01A5;
 
228
  UnicodeLower0100_024E[$01A6]:=$0280;
 
229
  UnicodeLower0100_024E[$01A7]:=$01A8;
 
230
  UnicodeLower0100_024E[$01A9]:=$0283;
 
231
  UnicodeLower0100_024E[$01AC]:=$01AD;
 
232
  UnicodeLower0100_024E[$01AE]:=$0288;
 
233
  UnicodeLower0100_024E[$01AF]:=$01B0;
 
234
  UnicodeLower0100_024E[$01B1]:=$028A;
 
235
  UnicodeLower0100_024E[$01B2]:=$028B;
 
236
  UnicodeLower0100_024E[$01B3]:=$01B4;
 
237
  UnicodeLower0100_024E[$01B5]:=$01B6;
 
238
  UnicodeLower0100_024E[$01B7]:=$0292;
 
239
  UnicodeLower0100_024E[$01B8]:=$01B9;
 
240
  UnicodeLower0100_024E[$01BC]:=$01BD;
 
241
  UnicodeLower0100_024E[$01C4]:=$01C6;
 
242
  UnicodeLower0100_024E[$01C5]:=$01C6;
 
243
  UnicodeLower0100_024E[$01C7]:=$01C9;
 
244
  UnicodeLower0100_024E[$01C8]:=$01C9;
 
245
  UnicodeLower0100_024E[$01CA]:=$01CC;
 
246
  UnicodeLower0100_024E[$01CB]:=$01CC;
 
247
  UnicodeLower0100_024E[$01CD]:=$01CE;
 
248
  UnicodeLower0100_024E[$01CF]:=$01D0;
 
249
  UnicodeLower0100_024E[$01D1]:=$01D2;
 
250
  UnicodeLower0100_024E[$01D3]:=$01D4;
 
251
  UnicodeLower0100_024E[$01D5]:=$01D6;
 
252
  UnicodeLower0100_024E[$01D7]:=$01D8;
 
253
  UnicodeLower0100_024E[$01D9]:=$01DA;
 
254
  UnicodeLower0100_024E[$01DB]:=$01DC;
 
255
  UnicodeLower0100_024E[$01DE]:=$01DF;
 
256
  UnicodeLower0100_024E[$01E0]:=$01E1;
 
257
  UnicodeLower0100_024E[$01E2]:=$01E3;
 
258
  UnicodeLower0100_024E[$01E4]:=$01E5;
 
259
  UnicodeLower0100_024E[$01E6]:=$01E7;
 
260
  UnicodeLower0100_024E[$01E8]:=$01E9;
 
261
  UnicodeLower0100_024E[$01EA]:=$01EB;
 
262
  UnicodeLower0100_024E[$01EC]:=$01ED;
 
263
  UnicodeLower0100_024E[$01EE]:=$01EF;
 
264
  UnicodeLower0100_024E[$01F1]:=$01F3;
 
265
  UnicodeLower0100_024E[$01F2]:=$01F3;
 
266
  UnicodeLower0100_024E[$01F4]:=$01F5;
 
267
  UnicodeLower0100_024E[$01F6]:=$0195;
 
268
  UnicodeLower0100_024E[$01F7]:=$01BF;
 
269
  UnicodeLower0100_024E[$01F8]:=$01F9;
 
270
  UnicodeLower0100_024E[$01FA]:=$01FB;
 
271
  UnicodeLower0100_024E[$01FC]:=$01FD;
 
272
  UnicodeLower0100_024E[$01FE]:=$01FF;
 
273
  UnicodeLower0100_024E[$0200]:=$0201;
 
274
  UnicodeLower0100_024E[$0202]:=$0203;
 
275
  UnicodeLower0100_024E[$0204]:=$0205;
 
276
  UnicodeLower0100_024E[$0206]:=$0207;
 
277
  UnicodeLower0100_024E[$0208]:=$0209;
 
278
  UnicodeLower0100_024E[$020A]:=$020B;
 
279
  UnicodeLower0100_024E[$020C]:=$020D;
 
280
  UnicodeLower0100_024E[$020E]:=$020F;
 
281
  UnicodeLower0100_024E[$0210]:=$0211;
 
282
  UnicodeLower0100_024E[$0212]:=$0213;
 
283
  UnicodeLower0100_024E[$0214]:=$0215;
 
284
  UnicodeLower0100_024E[$0216]:=$0217;
 
285
  UnicodeLower0100_024E[$0218]:=$0219;
 
286
  UnicodeLower0100_024E[$021A]:=$021B;
 
287
  UnicodeLower0100_024E[$021C]:=$021D;
 
288
  UnicodeLower0100_024E[$021E]:=$021F;
 
289
  UnicodeLower0100_024E[$0220]:=$019E;
 
290
  UnicodeLower0100_024E[$0222]:=$0223;
 
291
  UnicodeLower0100_024E[$0224]:=$0225;
 
292
  UnicodeLower0100_024E[$0226]:=$0227;
 
293
  UnicodeLower0100_024E[$0228]:=$0229;
 
294
  UnicodeLower0100_024E[$022A]:=$022B;
 
295
  UnicodeLower0100_024E[$022C]:=$022D;
 
296
  UnicodeLower0100_024E[$022E]:=$022F;
 
297
  UnicodeLower0100_024E[$0230]:=$0231;
 
298
  UnicodeLower0100_024E[$0232]:=$0233;
 
299
  UnicodeLower0100_024E[$023A]:=$2C65;
 
300
  UnicodeLower0100_024E[$023B]:=$023C;
 
301
  UnicodeLower0100_024E[$023D]:=$019A;
 
302
  UnicodeLower0100_024E[$023E]:=$2C66;
 
303
  UnicodeLower0100_024E[$0241]:=$0242;
 
304
  UnicodeLower0100_024E[$0243]:=$0180;
 
305
  UnicodeLower0100_024E[$0244]:=$0289;
 
306
  UnicodeLower0100_024E[$0245]:=$028C;
 
307
  UnicodeLower0100_024E[$0246]:=$0247;
 
308
  UnicodeLower0100_024E[$0248]:=$0249;
 
309
  UnicodeLower0100_024E[$024A]:=$024B;
 
310
  UnicodeLower0100_024E[$024C]:=$024D;
 
311
  UnicodeLower0100_024E[$024E]:=$024F;
 
312
 
 
313
  for i:=Low(UnicodeLower0386_03AB) to High(UnicodeLower0386_03AB) do
 
314
    UnicodeLower0386_03AB[i]:=i;
 
315
  UnicodeLower0386_03AB[$0386]:=$03AC;
 
316
  UnicodeLower0386_03AB[$0388]:=$03AD;
 
317
  UnicodeLower0386_03AB[$0389]:=$03AE;
 
318
  UnicodeLower0386_03AB[$038A]:=$03AF;
 
319
  UnicodeLower0386_03AB[$038C]:=$03CC;
 
320
  UnicodeLower0386_03AB[$038E]:=$03CD;
 
321
  UnicodeLower0386_03AB[$038F]:=$03CE;
 
322
  UnicodeLower0386_03AB[$0391]:=$03B1;
 
323
  UnicodeLower0386_03AB[$0392]:=$03B2;
 
324
  UnicodeLower0386_03AB[$0393]:=$03B3;
 
325
  UnicodeLower0386_03AB[$0394]:=$03B4;
 
326
  UnicodeLower0386_03AB[$0395]:=$03B5;
 
327
  UnicodeLower0386_03AB[$0396]:=$03B6;
 
328
  UnicodeLower0386_03AB[$0397]:=$03B7;
 
329
  UnicodeLower0386_03AB[$0398]:=$03B8;
 
330
  UnicodeLower0386_03AB[$0399]:=$03B9;
 
331
  UnicodeLower0386_03AB[$039A]:=$03BA;
 
332
  UnicodeLower0386_03AB[$039B]:=$03BB;
 
333
  UnicodeLower0386_03AB[$039C]:=$03BC;
 
334
  UnicodeLower0386_03AB[$039D]:=$03BD;
 
335
  UnicodeLower0386_03AB[$039E]:=$03BE;
 
336
  UnicodeLower0386_03AB[$039F]:=$03BF;
 
337
  UnicodeLower0386_03AB[$03A0]:=$03C0;
 
338
  UnicodeLower0386_03AB[$03A1]:=$03C1;
 
339
  UnicodeLower0386_03AB[$03A3]:=$03C3;
 
340
  UnicodeLower0386_03AB[$03A4]:=$03C4;
 
341
  UnicodeLower0386_03AB[$03A5]:=$03C5;
 
342
  UnicodeLower0386_03AB[$03A6]:=$03C6;
 
343
  UnicodeLower0386_03AB[$03A7]:=$03C7;
 
344
  UnicodeLower0386_03AB[$03A8]:=$03C8;
 
345
  UnicodeLower0386_03AB[$03A9]:=$03C9;
 
346
  UnicodeLower0386_03AB[$03AA]:=$03CA;
 
347
  UnicodeLower0386_03AB[$03AB]:=$03CB;
 
348
 
 
349
  for i:=Low(UnicodeLower03D8_042F) to High(UnicodeLower03D8_042F) do
 
350
    UnicodeLower03D8_042F[i]:=i;
 
351
  UnicodeLower03D8_042F[$03D8]:=$03D9;
 
352
  UnicodeLower03D8_042F[$03DA]:=$03DB;
 
353
  UnicodeLower03D8_042F[$03DC]:=$03DD;
 
354
  UnicodeLower03D8_042F[$03DE]:=$03DF;
 
355
  UnicodeLower03D8_042F[$03E0]:=$03E1;
 
356
  UnicodeLower03D8_042F[$03E2]:=$03E3;
 
357
  UnicodeLower03D8_042F[$03E4]:=$03E5;
 
358
  UnicodeLower03D8_042F[$03E6]:=$03E7;
 
359
  UnicodeLower03D8_042F[$03E8]:=$03E9;
 
360
  UnicodeLower03D8_042F[$03EA]:=$03EB;
 
361
  UnicodeLower03D8_042F[$03EC]:=$03ED;
 
362
  UnicodeLower03D8_042F[$03EE]:=$03EF;
 
363
  UnicodeLower03D8_042F[$03F4]:=$03B8;
 
364
  UnicodeLower03D8_042F[$03F7]:=$03F8;
 
365
  UnicodeLower03D8_042F[$03F9]:=$03F2;
 
366
  UnicodeLower03D8_042F[$03FA]:=$03FB;
 
367
  UnicodeLower03D8_042F[$03FD]:=$037B;
 
368
  UnicodeLower03D8_042F[$03FE]:=$037C;
 
369
  UnicodeLower03D8_042F[$03FF]:=$037D;
 
370
  UnicodeLower03D8_042F[$0400]:=$0450;
 
371
  UnicodeLower03D8_042F[$0401]:=$0451;
 
372
  UnicodeLower03D8_042F[$0402]:=$0452;
 
373
  UnicodeLower03D8_042F[$0403]:=$0453;
 
374
  UnicodeLower03D8_042F[$0404]:=$0454;
 
375
  UnicodeLower03D8_042F[$0405]:=$0455;
 
376
  UnicodeLower03D8_042F[$0406]:=$0456;
 
377
  UnicodeLower03D8_042F[$0407]:=$0457;
 
378
  UnicodeLower03D8_042F[$0408]:=$0458;
 
379
  UnicodeLower03D8_042F[$0409]:=$0459;
 
380
  UnicodeLower03D8_042F[$040A]:=$045A;
 
381
  UnicodeLower03D8_042F[$040B]:=$045B;
 
382
  UnicodeLower03D8_042F[$040C]:=$045C;
 
383
  UnicodeLower03D8_042F[$040D]:=$045D;
 
384
  UnicodeLower03D8_042F[$040E]:=$045E;
 
385
  UnicodeLower03D8_042F[$040F]:=$045F;
 
386
  UnicodeLower03D8_042F[$0410]:=$0430;
 
387
  UnicodeLower03D8_042F[$0411]:=$0431;
 
388
  UnicodeLower03D8_042F[$0412]:=$0432;
 
389
  UnicodeLower03D8_042F[$0413]:=$0433;
 
390
  UnicodeLower03D8_042F[$0414]:=$0434;
 
391
  UnicodeLower03D8_042F[$0415]:=$0435;
 
392
  UnicodeLower03D8_042F[$0416]:=$0436;
 
393
  UnicodeLower03D8_042F[$0417]:=$0437;
 
394
  UnicodeLower03D8_042F[$0418]:=$0438;
 
395
  UnicodeLower03D8_042F[$0419]:=$0439;
 
396
  UnicodeLower03D8_042F[$041A]:=$043A;
 
397
  UnicodeLower03D8_042F[$041B]:=$043B;
 
398
  UnicodeLower03D8_042F[$041C]:=$043C;
 
399
  UnicodeLower03D8_042F[$041D]:=$043D;
 
400
  UnicodeLower03D8_042F[$041E]:=$043E;
 
401
  UnicodeLower03D8_042F[$041F]:=$043F;
 
402
  UnicodeLower03D8_042F[$0420]:=$0440;
 
403
  UnicodeLower03D8_042F[$0421]:=$0441;
 
404
  UnicodeLower03D8_042F[$0422]:=$0442;
 
405
  UnicodeLower03D8_042F[$0423]:=$0443;
 
406
  UnicodeLower03D8_042F[$0424]:=$0444;
 
407
  UnicodeLower03D8_042F[$0425]:=$0445;
 
408
  UnicodeLower03D8_042F[$0426]:=$0446;
 
409
  UnicodeLower03D8_042F[$0427]:=$0447;
 
410
  UnicodeLower03D8_042F[$0428]:=$0448;
 
411
  UnicodeLower03D8_042F[$0429]:=$0449;
 
412
  UnicodeLower03D8_042F[$042A]:=$044A;
 
413
  UnicodeLower03D8_042F[$042B]:=$044B;
 
414
  UnicodeLower03D8_042F[$042C]:=$044C;
 
415
  UnicodeLower03D8_042F[$042D]:=$044D;
 
416
  UnicodeLower03D8_042F[$042E]:=$044E;
 
417
  UnicodeLower03D8_042F[$042F]:=$044F;
 
418
 
 
419
  for i:=Low(UnicodeLower0460_0512) to High(UnicodeLower0460_0512) do
 
420
    UnicodeLower0460_0512[i]:=i;
 
421
  UnicodeLower0460_0512[$0460]:=$0461;
 
422
  UnicodeLower0460_0512[$0462]:=$0463;
 
423
  UnicodeLower0460_0512[$0464]:=$0465;
 
424
  UnicodeLower0460_0512[$0466]:=$0467;
 
425
  UnicodeLower0460_0512[$0468]:=$0469;
 
426
  UnicodeLower0460_0512[$046A]:=$046B;
 
427
  UnicodeLower0460_0512[$046C]:=$046D;
 
428
  UnicodeLower0460_0512[$046E]:=$046F;
 
429
  UnicodeLower0460_0512[$0470]:=$0471;
 
430
  UnicodeLower0460_0512[$0472]:=$0473;
 
431
  UnicodeLower0460_0512[$0474]:=$0475;
 
432
  UnicodeLower0460_0512[$0476]:=$0477;
 
433
  UnicodeLower0460_0512[$0478]:=$0479;
 
434
  UnicodeLower0460_0512[$047A]:=$047B;
 
435
  UnicodeLower0460_0512[$047C]:=$047D;
 
436
  UnicodeLower0460_0512[$047E]:=$047F;
 
437
  UnicodeLower0460_0512[$0480]:=$0481;
 
438
  UnicodeLower0460_0512[$048A]:=$048B;
 
439
  UnicodeLower0460_0512[$048C]:=$048D;
 
440
  UnicodeLower0460_0512[$048E]:=$048F;
 
441
  UnicodeLower0460_0512[$0490]:=$0491;
 
442
  UnicodeLower0460_0512[$0492]:=$0493;
 
443
  UnicodeLower0460_0512[$0494]:=$0495;
 
444
  UnicodeLower0460_0512[$0496]:=$0497;
 
445
  UnicodeLower0460_0512[$0498]:=$0499;
 
446
  UnicodeLower0460_0512[$049A]:=$049B;
 
447
  UnicodeLower0460_0512[$049C]:=$049D;
 
448
  UnicodeLower0460_0512[$049E]:=$049F;
 
449
  UnicodeLower0460_0512[$04A0]:=$04A1;
 
450
  UnicodeLower0460_0512[$04A2]:=$04A3;
 
451
  UnicodeLower0460_0512[$04A4]:=$04A5;
 
452
  UnicodeLower0460_0512[$04A6]:=$04A7;
 
453
  UnicodeLower0460_0512[$04A8]:=$04A9;
 
454
  UnicodeLower0460_0512[$04AA]:=$04AB;
 
455
  UnicodeLower0460_0512[$04AC]:=$04AD;
 
456
  UnicodeLower0460_0512[$04AE]:=$04AF;
 
457
  UnicodeLower0460_0512[$04B0]:=$04B1;
 
458
  UnicodeLower0460_0512[$04B2]:=$04B3;
 
459
  UnicodeLower0460_0512[$04B4]:=$04B5;
 
460
  UnicodeLower0460_0512[$04B6]:=$04B7;
 
461
  UnicodeLower0460_0512[$04B8]:=$04B9;
 
462
  UnicodeLower0460_0512[$04BA]:=$04BB;
 
463
  UnicodeLower0460_0512[$04BC]:=$04BD;
 
464
  UnicodeLower0460_0512[$04BE]:=$04BF;
 
465
  UnicodeLower0460_0512[$04C0]:=$04CF;
 
466
  UnicodeLower0460_0512[$04C1]:=$04C2;
 
467
  UnicodeLower0460_0512[$04C3]:=$04C4;
 
468
  UnicodeLower0460_0512[$04C5]:=$04C6;
 
469
  UnicodeLower0460_0512[$04C7]:=$04C8;
 
470
  UnicodeLower0460_0512[$04C9]:=$04CA;
 
471
  UnicodeLower0460_0512[$04CB]:=$04CC;
 
472
  UnicodeLower0460_0512[$04CD]:=$04CE;
 
473
  UnicodeLower0460_0512[$04D0]:=$04D1;
 
474
  UnicodeLower0460_0512[$04D2]:=$04D3;
 
475
  UnicodeLower0460_0512[$04D4]:=$04D5;
 
476
  UnicodeLower0460_0512[$04D6]:=$04D7;
 
477
  UnicodeLower0460_0512[$04D8]:=$04D9;
 
478
  UnicodeLower0460_0512[$04DA]:=$04DB;
 
479
  UnicodeLower0460_0512[$04DC]:=$04DD;
 
480
  UnicodeLower0460_0512[$04DE]:=$04DF;
 
481
  UnicodeLower0460_0512[$04E0]:=$04E1;
 
482
  UnicodeLower0460_0512[$04E2]:=$04E3;
 
483
  UnicodeLower0460_0512[$04E4]:=$04E5;
 
484
  UnicodeLower0460_0512[$04E6]:=$04E7;
 
485
  UnicodeLower0460_0512[$04E8]:=$04E9;
 
486
  UnicodeLower0460_0512[$04EA]:=$04EB;
 
487
  UnicodeLower0460_0512[$04EC]:=$04ED;
 
488
  UnicodeLower0460_0512[$04EE]:=$04EF;
 
489
  UnicodeLower0460_0512[$04F0]:=$04F1;
 
490
  UnicodeLower0460_0512[$04F2]:=$04F3;
 
491
  UnicodeLower0460_0512[$04F4]:=$04F5;
 
492
  UnicodeLower0460_0512[$04F6]:=$04F7;
 
493
  UnicodeLower0460_0512[$04F8]:=$04F9;
 
494
  UnicodeLower0460_0512[$04FA]:=$04FB;
 
495
  UnicodeLower0460_0512[$04FC]:=$04FD;
 
496
  UnicodeLower0460_0512[$04FE]:=$04FF;
 
497
  UnicodeLower0460_0512[$0500]:=$0501;
 
498
  UnicodeLower0460_0512[$0502]:=$0503;
 
499
  UnicodeLower0460_0512[$0504]:=$0505;
 
500
  UnicodeLower0460_0512[$0506]:=$0507;
 
501
  UnicodeLower0460_0512[$0508]:=$0509;
 
502
  UnicodeLower0460_0512[$050A]:=$050B;
 
503
  UnicodeLower0460_0512[$050C]:=$050D;
 
504
  UnicodeLower0460_0512[$050E]:=$050F;
 
505
  UnicodeLower0460_0512[$0510]:=$0511;
 
506
  UnicodeLower0460_0512[$0512]:=$0513;
 
507
 
 
508
  for i:=Low(UnicodeLower1E00_1FFC) to High(UnicodeLower1E00_1FFC) do
 
509
    UnicodeLower1E00_1FFC[i]:=i;
 
510
  UnicodeLower1E00_1FFC[$1E00]:=$1E01;
 
511
  UnicodeLower1E00_1FFC[$1E02]:=$1E03;
 
512
  UnicodeLower1E00_1FFC[$1E04]:=$1E05;
 
513
  UnicodeLower1E00_1FFC[$1E06]:=$1E07;
 
514
  UnicodeLower1E00_1FFC[$1E08]:=$1E09;
 
515
  UnicodeLower1E00_1FFC[$1E0A]:=$1E0B;
 
516
  UnicodeLower1E00_1FFC[$1E0C]:=$1E0D;
 
517
  UnicodeLower1E00_1FFC[$1E0E]:=$1E0F;
 
518
  UnicodeLower1E00_1FFC[$1E10]:=$1E11;
 
519
  UnicodeLower1E00_1FFC[$1E12]:=$1E13;
 
520
  UnicodeLower1E00_1FFC[$1E14]:=$1E15;
 
521
  UnicodeLower1E00_1FFC[$1E16]:=$1E17;
 
522
  UnicodeLower1E00_1FFC[$1E18]:=$1E19;
 
523
  UnicodeLower1E00_1FFC[$1E1A]:=$1E1B;
 
524
  UnicodeLower1E00_1FFC[$1E1C]:=$1E1D;
 
525
  UnicodeLower1E00_1FFC[$1E1E]:=$1E1F;
 
526
  UnicodeLower1E00_1FFC[$1E20]:=$1E21;
 
527
  UnicodeLower1E00_1FFC[$1E22]:=$1E23;
 
528
  UnicodeLower1E00_1FFC[$1E24]:=$1E25;
 
529
  UnicodeLower1E00_1FFC[$1E26]:=$1E27;
 
530
  UnicodeLower1E00_1FFC[$1E28]:=$1E29;
 
531
  UnicodeLower1E00_1FFC[$1E2A]:=$1E2B;
 
532
  UnicodeLower1E00_1FFC[$1E2C]:=$1E2D;
 
533
  UnicodeLower1E00_1FFC[$1E2E]:=$1E2F;
 
534
  UnicodeLower1E00_1FFC[$1E30]:=$1E31;
 
535
  UnicodeLower1E00_1FFC[$1E32]:=$1E33;
 
536
  UnicodeLower1E00_1FFC[$1E34]:=$1E35;
 
537
  UnicodeLower1E00_1FFC[$1E36]:=$1E37;
 
538
  UnicodeLower1E00_1FFC[$1E38]:=$1E39;
 
539
  UnicodeLower1E00_1FFC[$1E3A]:=$1E3B;
 
540
  UnicodeLower1E00_1FFC[$1E3C]:=$1E3D;
 
541
  UnicodeLower1E00_1FFC[$1E3E]:=$1E3F;
 
542
  UnicodeLower1E00_1FFC[$1E40]:=$1E41;
 
543
  UnicodeLower1E00_1FFC[$1E42]:=$1E43;
 
544
  UnicodeLower1E00_1FFC[$1E44]:=$1E45;
 
545
  UnicodeLower1E00_1FFC[$1E46]:=$1E47;
 
546
  UnicodeLower1E00_1FFC[$1E48]:=$1E49;
 
547
  UnicodeLower1E00_1FFC[$1E4A]:=$1E4B;
 
548
  UnicodeLower1E00_1FFC[$1E4C]:=$1E4D;
 
549
  UnicodeLower1E00_1FFC[$1E4E]:=$1E4F;
 
550
  UnicodeLower1E00_1FFC[$1E50]:=$1E51;
 
551
  UnicodeLower1E00_1FFC[$1E52]:=$1E53;
 
552
  UnicodeLower1E00_1FFC[$1E54]:=$1E55;
 
553
  UnicodeLower1E00_1FFC[$1E56]:=$1E57;
 
554
  UnicodeLower1E00_1FFC[$1E58]:=$1E59;
 
555
  UnicodeLower1E00_1FFC[$1E5A]:=$1E5B;
 
556
  UnicodeLower1E00_1FFC[$1E5C]:=$1E5D;
 
557
  UnicodeLower1E00_1FFC[$1E5E]:=$1E5F;
 
558
  UnicodeLower1E00_1FFC[$1E60]:=$1E61;
 
559
  UnicodeLower1E00_1FFC[$1E62]:=$1E63;
 
560
  UnicodeLower1E00_1FFC[$1E64]:=$1E65;
 
561
  UnicodeLower1E00_1FFC[$1E66]:=$1E67;
 
562
  UnicodeLower1E00_1FFC[$1E68]:=$1E69;
 
563
  UnicodeLower1E00_1FFC[$1E6A]:=$1E6B;
 
564
  UnicodeLower1E00_1FFC[$1E6C]:=$1E6D;
 
565
  UnicodeLower1E00_1FFC[$1E6E]:=$1E6F;
 
566
  UnicodeLower1E00_1FFC[$1E70]:=$1E71;
 
567
  UnicodeLower1E00_1FFC[$1E72]:=$1E73;
 
568
  UnicodeLower1E00_1FFC[$1E74]:=$1E75;
 
569
  UnicodeLower1E00_1FFC[$1E76]:=$1E77;
 
570
  UnicodeLower1E00_1FFC[$1E78]:=$1E79;
 
571
  UnicodeLower1E00_1FFC[$1E7A]:=$1E7B;
 
572
  UnicodeLower1E00_1FFC[$1E7C]:=$1E7D;
 
573
  UnicodeLower1E00_1FFC[$1E7E]:=$1E7F;
 
574
  UnicodeLower1E00_1FFC[$1E80]:=$1E81;
 
575
  UnicodeLower1E00_1FFC[$1E82]:=$1E83;
 
576
  UnicodeLower1E00_1FFC[$1E84]:=$1E85;
 
577
  UnicodeLower1E00_1FFC[$1E86]:=$1E87;
 
578
  UnicodeLower1E00_1FFC[$1E88]:=$1E89;
 
579
  UnicodeLower1E00_1FFC[$1E8A]:=$1E8B;
 
580
  UnicodeLower1E00_1FFC[$1E8C]:=$1E8D;
 
581
  UnicodeLower1E00_1FFC[$1E8E]:=$1E8F;
 
582
  UnicodeLower1E00_1FFC[$1E90]:=$1E91;
 
583
  UnicodeLower1E00_1FFC[$1E92]:=$1E93;
 
584
  UnicodeLower1E00_1FFC[$1E94]:=$1E95;
 
585
  UnicodeLower1E00_1FFC[$1EA0]:=$1EA1;
 
586
  UnicodeLower1E00_1FFC[$1EA2]:=$1EA3;
 
587
  UnicodeLower1E00_1FFC[$1EA4]:=$1EA5;
 
588
  UnicodeLower1E00_1FFC[$1EA6]:=$1EA7;
 
589
  UnicodeLower1E00_1FFC[$1EA8]:=$1EA9;
 
590
  UnicodeLower1E00_1FFC[$1EAA]:=$1EAB;
 
591
  UnicodeLower1E00_1FFC[$1EAC]:=$1EAD;
 
592
  UnicodeLower1E00_1FFC[$1EAE]:=$1EAF;
 
593
  UnicodeLower1E00_1FFC[$1EB0]:=$1EB1;
 
594
  UnicodeLower1E00_1FFC[$1EB2]:=$1EB3;
 
595
  UnicodeLower1E00_1FFC[$1EB4]:=$1EB5;
 
596
  UnicodeLower1E00_1FFC[$1EB6]:=$1EB7;
 
597
  UnicodeLower1E00_1FFC[$1EB8]:=$1EB9;
 
598
  UnicodeLower1E00_1FFC[$1EBA]:=$1EBB;
 
599
  UnicodeLower1E00_1FFC[$1EBC]:=$1EBD;
 
600
  UnicodeLower1E00_1FFC[$1EBE]:=$1EBF;
 
601
  UnicodeLower1E00_1FFC[$1EC0]:=$1EC1;
 
602
  UnicodeLower1E00_1FFC[$1EC2]:=$1EC3;
 
603
  UnicodeLower1E00_1FFC[$1EC4]:=$1EC5;
 
604
  UnicodeLower1E00_1FFC[$1EC6]:=$1EC7;
 
605
  UnicodeLower1E00_1FFC[$1EC8]:=$1EC9;
 
606
  UnicodeLower1E00_1FFC[$1ECA]:=$1ECB;
 
607
  UnicodeLower1E00_1FFC[$1ECC]:=$1ECD;
 
608
  UnicodeLower1E00_1FFC[$1ECE]:=$1ECF;
 
609
  UnicodeLower1E00_1FFC[$1ED0]:=$1ED1;
 
610
  UnicodeLower1E00_1FFC[$1ED2]:=$1ED3;
 
611
  UnicodeLower1E00_1FFC[$1ED4]:=$1ED5;
 
612
  UnicodeLower1E00_1FFC[$1ED6]:=$1ED7;
 
613
  UnicodeLower1E00_1FFC[$1ED8]:=$1ED9;
 
614
  UnicodeLower1E00_1FFC[$1EDA]:=$1EDB;
 
615
  UnicodeLower1E00_1FFC[$1EDC]:=$1EDD;
 
616
  UnicodeLower1E00_1FFC[$1EDE]:=$1EDF;
 
617
  UnicodeLower1E00_1FFC[$1EE0]:=$1EE1;
 
618
  UnicodeLower1E00_1FFC[$1EE2]:=$1EE3;
 
619
  UnicodeLower1E00_1FFC[$1EE4]:=$1EE5;
 
620
  UnicodeLower1E00_1FFC[$1EE6]:=$1EE7;
 
621
  UnicodeLower1E00_1FFC[$1EE8]:=$1EE9;
 
622
  UnicodeLower1E00_1FFC[$1EEA]:=$1EEB;
 
623
  UnicodeLower1E00_1FFC[$1EEC]:=$1EED;
 
624
  UnicodeLower1E00_1FFC[$1EEE]:=$1EEF;
 
625
  UnicodeLower1E00_1FFC[$1EF0]:=$1EF1;
 
626
  UnicodeLower1E00_1FFC[$1EF2]:=$1EF3;
 
627
  UnicodeLower1E00_1FFC[$1EF4]:=$1EF5;
 
628
  UnicodeLower1E00_1FFC[$1EF6]:=$1EF7;
 
629
  UnicodeLower1E00_1FFC[$1EF8]:=$1EF9;
 
630
  UnicodeLower1E00_1FFC[$1F08]:=$1F00;
 
631
  UnicodeLower1E00_1FFC[$1F09]:=$1F01;
 
632
  UnicodeLower1E00_1FFC[$1F0A]:=$1F02;
 
633
  UnicodeLower1E00_1FFC[$1F0B]:=$1F03;
 
634
  UnicodeLower1E00_1FFC[$1F0C]:=$1F04;
 
635
  UnicodeLower1E00_1FFC[$1F0D]:=$1F05;
 
636
  UnicodeLower1E00_1FFC[$1F0E]:=$1F06;
 
637
  UnicodeLower1E00_1FFC[$1F0F]:=$1F07;
 
638
  UnicodeLower1E00_1FFC[$1F18]:=$1F10;
 
639
  UnicodeLower1E00_1FFC[$1F19]:=$1F11;
 
640
  UnicodeLower1E00_1FFC[$1F1A]:=$1F12;
 
641
  UnicodeLower1E00_1FFC[$1F1B]:=$1F13;
 
642
  UnicodeLower1E00_1FFC[$1F1C]:=$1F14;
 
643
  UnicodeLower1E00_1FFC[$1F1D]:=$1F15;
 
644
  UnicodeLower1E00_1FFC[$1F28]:=$1F20;
 
645
  UnicodeLower1E00_1FFC[$1F29]:=$1F21;
 
646
  UnicodeLower1E00_1FFC[$1F2A]:=$1F22;
 
647
  UnicodeLower1E00_1FFC[$1F2B]:=$1F23;
 
648
  UnicodeLower1E00_1FFC[$1F2C]:=$1F24;
 
649
  UnicodeLower1E00_1FFC[$1F2D]:=$1F25;
 
650
  UnicodeLower1E00_1FFC[$1F2E]:=$1F26;
 
651
  UnicodeLower1E00_1FFC[$1F2F]:=$1F27;
 
652
  UnicodeLower1E00_1FFC[$1F38]:=$1F30;
 
653
  UnicodeLower1E00_1FFC[$1F39]:=$1F31;
 
654
  UnicodeLower1E00_1FFC[$1F3A]:=$1F32;
 
655
  UnicodeLower1E00_1FFC[$1F3B]:=$1F33;
 
656
  UnicodeLower1E00_1FFC[$1F3C]:=$1F34;
 
657
  UnicodeLower1E00_1FFC[$1F3D]:=$1F35;
 
658
  UnicodeLower1E00_1FFC[$1F3E]:=$1F36;
 
659
  UnicodeLower1E00_1FFC[$1F3F]:=$1F37;
 
660
  UnicodeLower1E00_1FFC[$1F48]:=$1F40;
 
661
  UnicodeLower1E00_1FFC[$1F49]:=$1F41;
 
662
  UnicodeLower1E00_1FFC[$1F4A]:=$1F42;
 
663
  UnicodeLower1E00_1FFC[$1F4B]:=$1F43;
 
664
  UnicodeLower1E00_1FFC[$1F4C]:=$1F44;
 
665
  UnicodeLower1E00_1FFC[$1F4D]:=$1F45;
 
666
  UnicodeLower1E00_1FFC[$1F59]:=$1F51;
 
667
  UnicodeLower1E00_1FFC[$1F5B]:=$1F53;
 
668
  UnicodeLower1E00_1FFC[$1F5D]:=$1F55;
 
669
  UnicodeLower1E00_1FFC[$1F5F]:=$1F57;
 
670
  UnicodeLower1E00_1FFC[$1F68]:=$1F60;
 
671
  UnicodeLower1E00_1FFC[$1F69]:=$1F61;
 
672
  UnicodeLower1E00_1FFC[$1F6A]:=$1F62;
 
673
  UnicodeLower1E00_1FFC[$1F6B]:=$1F63;
 
674
  UnicodeLower1E00_1FFC[$1F6C]:=$1F64;
 
675
  UnicodeLower1E00_1FFC[$1F6D]:=$1F65;
 
676
  UnicodeLower1E00_1FFC[$1F6E]:=$1F66;
 
677
  UnicodeLower1E00_1FFC[$1F6F]:=$1F67;
 
678
  UnicodeLower1E00_1FFC[$1F88]:=$1F80;
 
679
  UnicodeLower1E00_1FFC[$1F89]:=$1F81;
 
680
  UnicodeLower1E00_1FFC[$1F8A]:=$1F82;
 
681
  UnicodeLower1E00_1FFC[$1F8B]:=$1F83;
 
682
  UnicodeLower1E00_1FFC[$1F8C]:=$1F84;
 
683
  UnicodeLower1E00_1FFC[$1F8D]:=$1F85;
 
684
  UnicodeLower1E00_1FFC[$1F8E]:=$1F86;
 
685
  UnicodeLower1E00_1FFC[$1F8F]:=$1F87;
 
686
  UnicodeLower1E00_1FFC[$1F98]:=$1F90;
 
687
  UnicodeLower1E00_1FFC[$1F99]:=$1F91;
 
688
  UnicodeLower1E00_1FFC[$1F9A]:=$1F92;
 
689
  UnicodeLower1E00_1FFC[$1F9B]:=$1F93;
 
690
  UnicodeLower1E00_1FFC[$1F9C]:=$1F94;
 
691
  UnicodeLower1E00_1FFC[$1F9D]:=$1F95;
 
692
  UnicodeLower1E00_1FFC[$1F9E]:=$1F96;
 
693
  UnicodeLower1E00_1FFC[$1F9F]:=$1F97;
 
694
  UnicodeLower1E00_1FFC[$1FA8]:=$1FA0;
 
695
  UnicodeLower1E00_1FFC[$1FA9]:=$1FA1;
 
696
  UnicodeLower1E00_1FFC[$1FAA]:=$1FA2;
 
697
  UnicodeLower1E00_1FFC[$1FAB]:=$1FA3;
 
698
  UnicodeLower1E00_1FFC[$1FAC]:=$1FA4;
 
699
  UnicodeLower1E00_1FFC[$1FAD]:=$1FA5;
 
700
  UnicodeLower1E00_1FFC[$1FAE]:=$1FA6;
 
701
  UnicodeLower1E00_1FFC[$1FAF]:=$1FA7;
 
702
  UnicodeLower1E00_1FFC[$1FB8]:=$1FB0;
 
703
  UnicodeLower1E00_1FFC[$1FB9]:=$1FB1;
 
704
  UnicodeLower1E00_1FFC[$1FBA]:=$1F70;
 
705
  UnicodeLower1E00_1FFC[$1FBB]:=$1F71;
 
706
  UnicodeLower1E00_1FFC[$1FBC]:=$1FB3;
 
707
  UnicodeLower1E00_1FFC[$1FC8]:=$1F72;
 
708
  UnicodeLower1E00_1FFC[$1FC9]:=$1F73;
 
709
  UnicodeLower1E00_1FFC[$1FCA]:=$1F74;
 
710
  UnicodeLower1E00_1FFC[$1FCB]:=$1F75;
 
711
  UnicodeLower1E00_1FFC[$1FCC]:=$1FC3;
 
712
  UnicodeLower1E00_1FFC[$1FD8]:=$1FD0;
 
713
  UnicodeLower1E00_1FFC[$1FD9]:=$1FD1;
 
714
  UnicodeLower1E00_1FFC[$1FDA]:=$1F76;
 
715
  UnicodeLower1E00_1FFC[$1FDB]:=$1F77;
 
716
  UnicodeLower1E00_1FFC[$1FE8]:=$1FE0;
 
717
  UnicodeLower1E00_1FFC[$1FE9]:=$1FE1;
 
718
  UnicodeLower1E00_1FFC[$1FEA]:=$1F7A;
 
719
  UnicodeLower1E00_1FFC[$1FEB]:=$1F7B;
 
720
  UnicodeLower1E00_1FFC[$1FEC]:=$1FE5;
 
721
  UnicodeLower1E00_1FFC[$1FF8]:=$1F78;
 
722
  UnicodeLower1E00_1FFC[$1FF9]:=$1F79;
 
723
  UnicodeLower1E00_1FFC[$1FFA]:=$1F7C;
 
724
  UnicodeLower1E00_1FFC[$1FFB]:=$1F7D;
 
725
  UnicodeLower1E00_1FFC[$1FFC]:=$1FF3;
 
726
 
 
727
  for i:=Low(UnicodeLower2126_2183) to High(UnicodeLower2126_2183) do
 
728
    UnicodeLower2126_2183[i]:=i;
 
729
  UnicodeLower2126_2183[$2126]:=$03C9;
 
730
  UnicodeLower2126_2183[$212A]:=$006B;
 
731
  UnicodeLower2126_2183[$212B]:=$00E5;
 
732
  UnicodeLower2126_2183[$2132]:=$214E;
 
733
  UnicodeLower2126_2183[$2160]:=$2170;
 
734
  UnicodeLower2126_2183[$2161]:=$2171;
 
735
  UnicodeLower2126_2183[$2162]:=$2172;
 
736
  UnicodeLower2126_2183[$2163]:=$2173;
 
737
  UnicodeLower2126_2183[$2164]:=$2174;
 
738
  UnicodeLower2126_2183[$2165]:=$2175;
 
739
  UnicodeLower2126_2183[$2166]:=$2176;
 
740
  UnicodeLower2126_2183[$2167]:=$2177;
 
741
  UnicodeLower2126_2183[$2168]:=$2178;
 
742
  UnicodeLower2126_2183[$2169]:=$2179;
 
743
  UnicodeLower2126_2183[$216A]:=$217A;
 
744
  UnicodeLower2126_2183[$216B]:=$217B;
 
745
  UnicodeLower2126_2183[$216C]:=$217C;
 
746
  UnicodeLower2126_2183[$216D]:=$217D;
 
747
  UnicodeLower2126_2183[$216E]:=$217E;
 
748
  UnicodeLower2126_2183[$216F]:=$217F;
 
749
  UnicodeLower2126_2183[$2183]:=$2184;
 
750
 
 
751
  for i:=Low(UnicodeLower2C60_2CE2) to High(UnicodeLower2C60_2CE2) do
 
752
    UnicodeLower2C60_2CE2[i]:=i;
 
753
  UnicodeLower2C60_2CE2[$2C60]:=$2C61;
 
754
  UnicodeLower2C60_2CE2[$2C62]:=$026B;
 
755
  UnicodeLower2C60_2CE2[$2C63]:=$1D7D;
 
756
  UnicodeLower2C60_2CE2[$2C64]:=$027D;
 
757
  UnicodeLower2C60_2CE2[$2C67]:=$2C68;
 
758
  UnicodeLower2C60_2CE2[$2C69]:=$2C6A;
 
759
  UnicodeLower2C60_2CE2[$2C6B]:=$2C6C;
 
760
  UnicodeLower2C60_2CE2[$2C75]:=$2C76;
 
761
  UnicodeLower2C60_2CE2[$2C80]:=$2C81;
 
762
  UnicodeLower2C60_2CE2[$2C82]:=$2C83;
 
763
  UnicodeLower2C60_2CE2[$2C84]:=$2C85;
 
764
  UnicodeLower2C60_2CE2[$2C86]:=$2C87;
 
765
  UnicodeLower2C60_2CE2[$2C88]:=$2C89;
 
766
  UnicodeLower2C60_2CE2[$2C8A]:=$2C8B;
 
767
  UnicodeLower2C60_2CE2[$2C8C]:=$2C8D;
 
768
  UnicodeLower2C60_2CE2[$2C8E]:=$2C8F;
 
769
  UnicodeLower2C60_2CE2[$2C90]:=$2C91;
 
770
  UnicodeLower2C60_2CE2[$2C92]:=$2C93;
 
771
  UnicodeLower2C60_2CE2[$2C94]:=$2C95;
 
772
  UnicodeLower2C60_2CE2[$2C96]:=$2C97;
 
773
  UnicodeLower2C60_2CE2[$2C98]:=$2C99;
 
774
  UnicodeLower2C60_2CE2[$2C9A]:=$2C9B;
 
775
  UnicodeLower2C60_2CE2[$2C9C]:=$2C9D;
 
776
  UnicodeLower2C60_2CE2[$2C9E]:=$2C9F;
 
777
  UnicodeLower2C60_2CE2[$2CA0]:=$2CA1;
 
778
  UnicodeLower2C60_2CE2[$2CA2]:=$2CA3;
 
779
  UnicodeLower2C60_2CE2[$2CA4]:=$2CA5;
 
780
  UnicodeLower2C60_2CE2[$2CA6]:=$2CA7;
 
781
  UnicodeLower2C60_2CE2[$2CA8]:=$2CA9;
 
782
  UnicodeLower2C60_2CE2[$2CAA]:=$2CAB;
 
783
  UnicodeLower2C60_2CE2[$2CAC]:=$2CAD;
 
784
  UnicodeLower2C60_2CE2[$2CAE]:=$2CAF;
 
785
  UnicodeLower2C60_2CE2[$2CB0]:=$2CB1;
 
786
  UnicodeLower2C60_2CE2[$2CB2]:=$2CB3;
 
787
  UnicodeLower2C60_2CE2[$2CB4]:=$2CB5;
 
788
  UnicodeLower2C60_2CE2[$2CB6]:=$2CB7;
 
789
  UnicodeLower2C60_2CE2[$2CB8]:=$2CB9;
 
790
  UnicodeLower2C60_2CE2[$2CBA]:=$2CBB;
 
791
  UnicodeLower2C60_2CE2[$2CBC]:=$2CBD;
 
792
  UnicodeLower2C60_2CE2[$2CBE]:=$2CBF;
 
793
  UnicodeLower2C60_2CE2[$2CC0]:=$2CC1;
 
794
  UnicodeLower2C60_2CE2[$2CC2]:=$2CC3;
 
795
  UnicodeLower2C60_2CE2[$2CC4]:=$2CC5;
 
796
  UnicodeLower2C60_2CE2[$2CC6]:=$2CC7;
 
797
  UnicodeLower2C60_2CE2[$2CC8]:=$2CC9;
 
798
  UnicodeLower2C60_2CE2[$2CCA]:=$2CCB;
 
799
  UnicodeLower2C60_2CE2[$2CCC]:=$2CCD;
 
800
  UnicodeLower2C60_2CE2[$2CCE]:=$2CCF;
 
801
  UnicodeLower2C60_2CE2[$2CD0]:=$2CD1;
 
802
  UnicodeLower2C60_2CE2[$2CD2]:=$2CD3;
 
803
  UnicodeLower2C60_2CE2[$2CD4]:=$2CD5;
 
804
  UnicodeLower2C60_2CE2[$2CD6]:=$2CD7;
 
805
  UnicodeLower2C60_2CE2[$2CD8]:=$2CD9;
 
806
  UnicodeLower2C60_2CE2[$2CDA]:=$2CDB;
 
807
  UnicodeLower2C60_2CE2[$2CDC]:=$2CDD;
 
808
  UnicodeLower2C60_2CE2[$2CDE]:=$2CDF;
 
809
  UnicodeLower2C60_2CE2[$2CE0]:=$2CE1;
 
810
  UnicodeLower2C60_2CE2[$2CE2]:=$2CE3;
 
811
end;
 
812
 
 
813
function UnicodeLowercase(u: cardinal): cardinal;
 
814
begin
 
815
  if u<$00C0 then begin
 
816
    // most common
 
817
    if (u>=$0041) and (u<=$0061) then
 
818
      Result:=u+32
 
819
    else
 
820
      Result:=u;
 
821
  end else
 
822
    case u of
 
823
    $00C0..$00DE: Result:=UnicodeLower00C0_00DE[u];
 
824
    $0100..$024E: Result:=UnicodeLower0100_024E[u];
 
825
    $0386..$03AB: Result:=UnicodeLower0386_03AB[u];
 
826
    $03D8..$042F: Result:=UnicodeLower03D8_042F[u];
 
827
    $0460..$0512: Result:=UnicodeLower0460_0512[u];
 
828
    $0531..$0556: Result:=u+48;
 
829
    $10A0..$10C5: Result:=u+7264;
 
830
    $1E00..$1FFC: Result:=UnicodeLower1E00_1FFC[u];
 
831
    $2126..$2183: Result:=UnicodeLower2126_2183[u];
 
832
    $24B6..$24CF: Result:=u+26;
 
833
    $2C00..$2C2E: Result:=u+48;
 
834
    $2C60..$2CE2: Result:=UnicodeLower2C60_2CE2[u];
 
835
    $FF21..$FF3A: Result:=u+32;
 
836
    else          Result:=u;
 
837
  end;
 
838
end;
 
839
 
 
840
 
 
841
 
 
842
function UTF8LowercaseDynLength(const s: string): string;
 
843
var
 
844
  Buf: shortstring;
 
845
  SrcPos: PtrInt;
 
846
  DstPos: PtrInt;
 
847
  CharLen: integer;
 
848
  OldCode: LongWord;
 
849
  NewCode: LongWord;
 
850
begin
 
851
  // first compute needed length
 
852
  SrcPos:=1;
 
853
  DstPos:=1;
 
854
  while SrcPos<=length(s) do begin
 
855
    case s[SrcPos] of
 
856
    #192..#240:
 
857
      begin
 
858
        OldCode:=UTF8CharacterToUnicode(@s[SrcPos],CharLen);
 
859
        NewCode:=UnicodeLowercase(OldCode);
 
860
        if NewCode=OldCode then begin
 
861
          inc(DstPos,CharLen);
 
862
        end else begin
 
863
          inc(DstPos,UnicodeToUTF8(NewCode,@Buf[1]));
 
864
        end;
 
865
        inc(SrcPos,CharLen);
 
866
      end;
 
867
    else
 
868
      inc(SrcPos);
 
869
      inc(DstPos);
 
870
    end;
 
871
  end;
 
872
  SetLength(Result,DstPos-1);
 
873
  if Result='' then exit;
 
874
  // create the new string
 
875
  SrcPos:=1;
 
876
  DstPos:=1;
 
877
  while SrcPos<=length(s) do begin
 
878
    case s[SrcPos] of
 
879
    #192..#240:
 
880
      begin
 
881
        OldCode:=UTF8CharacterToUnicode(@s[SrcPos],CharLen);
 
882
        NewCode:=UnicodeLowercase(OldCode);
 
883
        if NewCode=OldCode then begin
 
884
          System.Move(s[SrcPos],Result[DstPos],CharLen);
 
885
          inc(DstPos,CharLen);
 
886
        end else begin
 
887
          inc(DstPos,UnicodeToUTF8(NewCode,@Result[DstPos]));
 
888
        end;
 
889
        inc(SrcPos,CharLen);
 
890
      end;
 
891
    else
 
892
      Result[DstPos]:=s[SrcPos];
 
893
      inc(SrcPos);
 
894
      inc(DstPos);
 
895
    end;
 
896
  end;
 
897
end;
 
898
 
 
899
function UTF8LowerCaseViaTables(const s: string): string;
 
900
var
 
901
  i: PtrInt;
 
902
  CharLen: integer;
 
903
  OldCode: LongWord;
 
904
  NewCode: LongWord;
 
905
  NewCharLen: integer;
 
906
  Changed: Boolean;
 
907
  p: PChar;
 
908
begin
 
909
  Result:=s;
 
910
  if Result='' then exit;
 
911
  Changed:=false;
 
912
  p:=PChar(Result);
 
913
  repeat
 
914
    case p^ of
 
915
    #0:
 
916
      if p-PChar(Result)=length(Result) then
 
917
        exit
 
918
      else
 
919
        inc(p);
 
920
    'A'..'Z': // First ASCII chars
 
921
      begin
 
922
        if not Changed then begin
 
923
          i:=p-PChar(Result)+1;
 
924
          UniqueString(Result);
 
925
          Changed:=true;
 
926
          p:=@Result[i];
 
927
        end;
 
928
        p^:=chr(ord(p^)+32);
 
929
        inc(p);
 
930
      end;
 
931
 
 
932
    #192..#240: // Now chars with multiple bytes
 
933
      begin
 
934
        OldCode:=UTF8CharacterToUnicode(p,CharLen);
 
935
        NewCode:=UnicodeLowercase(OldCode);
 
936
        if NewCode<>OldCode then begin
 
937
          if not Changed then begin
 
938
            i:=p-PChar(Result)+1;
 
939
            UniqueString(Result);
 
940
            Changed:=true;
 
941
            p:=@Result[i];
 
942
          end;
 
943
          NewCharLen:=UnicodeToUTF8(NewCode,p);
 
944
          if CharLen<>NewCharLen then begin
 
945
            // string size changed => use slower function
 
946
            Result:=UTF8LowercaseDynLength(s);
 
947
            exit;
 
948
          end;
 
949
        end;
 
950
        inc(p,CharLen);
 
951
      end;
 
952
    else
 
953
      inc(p);
 
954
    end;
 
955
  until false;
 
956
end;
 
957
 
 
958
initialization
 
959
  InitUnicodeTables;
 
960
end.
 
961