summaryrefslogtreecommitdiff
path: root/xfa/src/fgas/src/crt/fx_codepage.cpp
blob: 86d8b45c8217428889a8e5d7ca1f9e4c018f9a44 (plain)
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
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#include "../fgas_base.h"
#include "fx_codepage.h"
static const FX_CHARSET_MAP g_FXCharset2CodePageTable[] = {
    { 0,	1252  },
    { 1,	0	  },
    { 2,	42	  },
    { 77,	10000 },
    { 78,	10001 },
    { 79,	10003 },
    { 80,	10008 },
    { 81,	10002 },
    { 83,	10005 },
    { 84,	10004 },
    { 85,	10006 },
    { 86,	10081 },
    { 87,	10021 },
    { 88,	10029 },
    { 89,	10007 },
    { 128,	932	},
    { 129,	949	},
    { 130,	1361 },
    { 134,	936	},
    { 136,	950	},
    { 161,	1253 },
    { 162,	1254 },
    { 163,	1258 },
    { 177,	1255 },
    { 178,	1256 },
    { 186,	1257 },
    { 204,	1251 },
    { 222,	874	},
    { 238,	1250 },
    { 254,	437	},
    { 255,	850	},
};
FX_WORD FX_GetCodePageFromCharset(uint8_t charset)
{
    int32_t iEnd = sizeof(g_FXCharset2CodePageTable) / sizeof(FX_CHARSET_MAP) - 1;
    FXSYS_assert(iEnd >= 0);
    int32_t iStart = 0, iMid;
    do {
        iMid = (iStart + iEnd) / 2;
        const FX_CHARSET_MAP & cp = g_FXCharset2CodePageTable[iMid];
        if (charset == cp.charset) {
            return cp.codepage;
        } else if (charset < cp.charset) {
            iEnd = iMid - 1;
        } else {
            iStart = iMid + 1;
        }
    } while (iStart <= iEnd);
    return 0xFFFF;
}
static const FX_CHARSET_MAP g_FXCodepage2CharsetTable[] = {
    { 1,	0	  },
    { 2,	42	  },
    { 254,	437	},
    { 255,	850	},
    { 222,	874	},
    { 128,	932	},
    { 134,	936	},
    { 129,	949	},
    { 136,	950	},
    { 238,	1250 },
    { 204,	1251 },
    { 0,	1252  },
    { 161,	1253 },
    { 162,	1254 },
    { 177,	1255 },
    { 178,	1256 },
    { 186,	1257 },
    { 163,	1258 },
    { 130,	1361 },
    { 77,	10000 },
    { 78,	10001 },
    { 79,	10003 },
    { 80,	10008 },
    { 81,	10002 },
    { 83,	10005 },
    { 84,	10004 },
    { 85,	10006 },
    { 86,	10081 },
    { 87,	10021 },
    { 88,	10029 },
    { 89,	10007 },
};
FX_WORD FX_GetCharsetFromCodePage(FX_WORD codepage)
{
    int32_t iEnd = sizeof(g_FXCodepage2CharsetTable) / sizeof(FX_CHARSET_MAP) - 1;
    FXSYS_assert(iEnd >= 0);
    int32_t iStart = 0, iMid;
    do {
        iMid = (iStart + iEnd) / 2;
        const FX_CHARSET_MAP & cp = g_FXCodepage2CharsetTable[iMid];
        if (codepage == cp.codepage) {
            return cp.charset;
        } else if (codepage < cp.codepage) {
            iEnd = iMid - 1;
        } else {
            iStart = iMid + 1;
        }
    } while (iStart <= iEnd);
    return 0xFFFF;
}
const FX_LANG2CPMAP g_FXLang2CodepageTable[] = {
    {FX_LANG_Arabic_SaudiArabia       ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Bulgarian_Bulgaria       ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Catalan_Catalan          ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Chinese_Taiwan           ,	FX_CODEPAGE_ChineseTraditional   },
    {FX_LANG_CzechRepublic            ,	FX_CODEPAGE_MSWin_EasternEuropean},
    {FX_LANG_Danish_Denmark           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_German_Germany           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Greek_Greece             ,	FX_CODEPAGE_MSWin_Greek          },
    {FX_LANG_English_UnitedStates     ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_TraditionalSort  ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Finnish_Finland          ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_French_France            ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Hebrew_Israel            ,	FX_CODEPAGE_MSWin_Hebrew         },
    {FX_LANG_Hungarian_Hungary        ,	FX_CODEPAGE_MSWin_EasternEuropean},
    {FX_LANG_Icelandic_Iceland        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Italian_Italy            ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Japanese_Japan           ,	FX_CODEPAGE_ShiftJIS             },
    {FX_LANG_Korean_Korea             ,	FX_CODEPAGE_Korean               },
    {FX_LANG_Dutch_Netherlands        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Norwegian_Bokmal         ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Polish_Poland            ,	FX_CODEPAGE_MSWin_EasternEuropean},
    {FX_LANG_Portuguese_Brazil        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Romanian_Romania         ,	FX_CODEPAGE_MSWin_EasternEuropean},
    {FX_LANG_Russian_Russia           ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Croatian_Croatia         ,	FX_CODEPAGE_MSWin_EasternEuropean},
    {FX_LANG_Slovak_Slovakia          ,	FX_CODEPAGE_MSWin_EasternEuropean},
    {FX_LANG_Albanian_Albania         ,	FX_CODEPAGE_MSWin_EasternEuropean},
    {FX_LANG_Swedish_Sweden           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Thai_Thailand            ,	FX_CODEPAGE_MSDOS_Thai           },
    {FX_LANG_Turkish_Turkey           ,	FX_CODEPAGE_MSWin_Turkish        },
    {FX_LANG_Urdu_Pakistan            ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Indonesian_Indonesia     ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Ukrainian_Ukraine        ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Belarusian_Belarus       ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Slovenian_Slovenia       ,	FX_CODEPAGE_MSWin_EasternEuropean},
    {FX_LANG_Estonian_Estonia         ,	FX_CODEPAGE_MSWin_Baltic         },
    {FX_LANG_Latvian_Latvia           ,	FX_CODEPAGE_MSWin_Baltic         },
    {FX_LANG_Lithuanian_Lithuania     ,	FX_CODEPAGE_MSWin_Baltic         },
    {FX_LANG_Persian                  ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Vietnamese_Vietnam       ,	FX_CODEPAGE_MSWin_Vietnamese     },
    {FX_LANG_Armenian_Armenia         ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Azerbaijan_Latin         ,	FX_CODEPAGE_MSWin_Turkish        },
    {FX_LANG_Basque_Basque            ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Macedonian               ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Afrikaans_SouthAfrica    ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Georgian_Georgia         ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Faroese_FaroeIslands     ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Hindi_India              ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Malay_Malaysia           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Kazakh_Kazakhstan        ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Kyrgyz_Kyrgyzstan        ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Kiswahili_Kenya          ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Uzbek_LatinUzbekistan    ,	FX_CODEPAGE_MSWin_Turkish        },
    {FX_LANG_Tatar_Russia             ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Punjabi_India            ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Gujarati_India           ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Tamil_India              ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Telugu_India             ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Kannada_India            ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Marathi_India            ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_SanskritIndia            ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Mongolian_CyrillicMongolia,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Galician_Galician        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Konkani_India            ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Syriac_Syria             ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Divehi_Maldives          ,	FX_CODEPAGE_DefANSI              },
    {FX_LANG_Arabic_Iraq              ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Chinese_PRC              ,	FX_CODEPAGE_ChineseSimplified    },
    {FX_LANG_German_Switzerland       ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_English_UnitedKingdom    ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Mexico           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_French_Belgium           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Italian_Switzerland      ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Dutch_Belgium            ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Norwegian_Nynorsk        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Portuguese_Portugal      ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_SerbianLatin_Serbia      ,	FX_CODEPAGE_MSWin_EasternEuropean},
    {FX_LANG_Swedish_Finland          ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Azerbaijan_Cyrillic      ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Malay_BruneiDarussalam   ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Uzbek_CyrillicUzbekistan ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Arabic_Egypt             ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Chinese_HongKong         ,	FX_CODEPAGE_ChineseTraditional   },
    {FX_LANG_German_Austria           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_English_Australia        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_InternationalSort,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_French_Canada            ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_SerbianCyrillic_Serbia   ,	FX_CODEPAGE_MSWin_Cyrillic       },
    {FX_LANG_Arabic_Libya             ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Chinese_Singapore        ,	FX_CODEPAGE_ChineseSimplified    },
    {FX_LANG_German_Luxembourg        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_English_Canada           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Guatemala        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_French_Switzerland       ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Algeria           ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Chinese_Macao            ,	FX_CODEPAGE_ChineseTraditional   },
    {FX_LANG_German_Liechtenstein     ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_English_NewZealand       ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_CostaRica        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_French_Luxembourg        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Morocco           ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_English_Ireland          ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Panama           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_French_Monaco            ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Tunisia           ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_English_SouthAfrica      ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_DominicanRepublic,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Oman              ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_English_Jamaica          ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Venezuela        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Yemen             ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_English_Caribbean        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Colombia         ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Syria             ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_English_Belize           ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Peru             ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Jordan            ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_English_TrinidadTobago   ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Argentina        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Lebanon           ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_English_Zimbabwe         ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Ecuador          ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Kuwait            ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_English_Philippines      ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Chile            ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_UAE               ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Spanish_Uruguay          ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Bahrain           ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Spanish_Paraguay         ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Arabic_Qatar             ,	FX_CODEPAGE_MSWin_Arabic         },
    {FX_LANG_Spanish_Bolivia          ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_ElSalvador       ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Honduras         ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_Nicaragua        ,	FX_CODEPAGE_MSWin_WesternEuropean},
    {FX_LANG_Spanish_PuertoRico       ,	FX_CODEPAGE_MSWin_WesternEuropean},
};
FX_WORD FX_GetDefCodePageByLanguage(FX_WORD wLanguage)
{
    int32_t iEnd = sizeof(g_FXLang2CodepageTable) / sizeof(FX_LANG2CPMAP) - 1;
    FXSYS_assert(iEnd >= 0);
    int32_t iStart = 0, iMid;
    do {
        iMid = (iStart + iEnd) / 2;
        const FX_LANG2CPMAP &cp = g_FXLang2CodepageTable[iMid];
        if (wLanguage == cp.wLanguage) {
            return cp.wCodepage;
        } else if (wLanguage < cp.wLanguage) {
            iEnd = iMid - 1;
        } else {
            iStart = iMid + 1;
        }
    } while (iStart <= iEnd);
    return 0xFFFF;
}
static const FX_STR2CPHASH g_FXCPHashTable[] = {
    { 0xd45,	0x6faf },		{ 0xd46,	0x6fb0 },		{ 0xd47,	0x6fb1 },		{ 0xd48,	0x6fb2 },
    { 0xd49,	0x4e6 },		{ 0xd4d,	0x6fbd },		{ 0xe9e,	0x4e4 },		{ 0xc998,	0x1b5 },
    { 0x18ef0,	0x3a8 },		{ 0x19f85,	0x5182 },		{ 0x2e2335,	0x3b6 },		{ 0x325153,	0x5182 },
    { 0x145bded,	0x2716 },	{ 0x3c9a5f2,	0xc6f3 },	{ 0x4c45f2d,	0x3a4 },	{ 0x4c45f4e,	0xc431 },
    { 0x58caf51,	0x4e4 },	{ 0x5a5cd7d,	0x3a8 },	{ 0x5a6c6a7,	0x4e4 },	{ 0x5a6ca0b,	0x1b5 },
    { 0x5a6cd68,	0x307 },	{ 0x5a6d8d3,	0x4e4 },	{ 0x5a6d948,	0x354 },	{ 0x5a6d96b,	0x362 },
    { 0x5a6d984,	0x366 },	{ 0x5a90e35,	0x1b5 },	{ 0x5e0cf00,	0x6fb5 },	{ 0x609c324,	0x551 },
    { 0x617d97f,	0x5182 },	{ 0x6a6fd91,	0xfde8 },	{ 0x6a6fd92,	0xfde9 },	{ 0x6b102de,	0xcadc },
    { 0x6b10f48,	0x4e89 },	{ 0x1020805f,	0x4e4 },	{ 0x10f0524c,	0x6fb5 },	{ 0x11d558fe,	0x6fb0 },
    { 0x13898d19,	0xc42d },	{ 0x13898d3a,	0xc431 },	{ 0x138a319e,	0x6fb1 },	{ 0x14679c09,	0x96c6 },
    { 0x153f0a3d,	0x6fb2 },	{ 0x1576eeb3,	0x4e20 },	{ 0x169a0ce6,	0xc6f9 },	{ 0x16f3e2dc,	0x6fb3 },
    { 0x18a8bb7a,	0x6fb4 },	{ 0x1a5d9419,	0x6fb5 },	{ 0x1a847b48,	0x3a8 },	{ 0x1b762419,	0xcec8 },
    { 0x1b9d7847,	0x475 },	{ 0x1c126cb9,	0x6fb6 },	{ 0x1ccdbc7d,	0x4f42 },	{ 0x1d330f5f,	0x2714 },
    { 0x1dc74559,	0x4e6 },	{ 0x1edd80da,	0x4e4 },	{ 0x23e4b03d,	0xfde8 },	{ 0x24f28a16,	0x4f3d },
    { 0x286e7a32,	0x2715 },	{ 0x2c7c18ed,	0x3a8 },	{ 0x2e2103b7,	0x2713 },	{ 0x304bf479,	0x6fb4 },
    { 0x304bf47d,	0x6fb5 },	{ 0x309bb869,	0xfde8 },	{ 0x309bb86a,	0xfde9 },	{ 0x33664357,	0x3b6 },
    { 0x352d6b49,	0x3a4 },	{ 0x36f5661c,	0x1b5 },	{ 0x392e8f48,	0xcadc },	{ 0x3dc7c64c,	0x47c },
    { 0x3ed2e8e1,	0x4e4 },	{ 0x3f0c2fea,	0xcaed },	{ 0x3f0fef8f,	0xc6f2 },	{ 0x3f5e130f,	0x5182 },
    { 0x47174d1f,	0x3a8 },	{ 0x49686b7b,	0x6fb4 },	{ 0x4b80b0d9,	0x3a4 },	{ 0x4dcda97a,	0x4e4 },
    { 0x4dcda9b6,	0x4e4 },	{ 0x4e881e6a,	0x5221 },	{ 0x4ffdf5a1,	0x36a },	{ 0x4ffdf5a5,	0x6fbd },
    { 0x5241ce16,	0x4e8b },	{ 0x546bab9d,	0x4e4 },	{ 0x54a3d64e,	0x6fb6 },	{ 0x562179bd,	0x5161 },
    { 0x57c1df15,	0xc6f7 },	{ 0x61ff6e62,	0x4f36 },	{ 0x6359c7d8,	0x4f35 },	{ 0x63f3c335,	0x3a8 },
    { 0x645a0f78,	0x477 },	{ 0x691ac2fd,	0x275f },	{ 0x6dc2eab0,	0x2d0 },	{ 0x6dc2eeef,	0x35e },
    { 0x6dc2ef10,	0x36a },	{ 0x7103138a,	0x47d },	{ 0x710dfbd0,	0xc6f5 },	{ 0x7319f6cb,	0x36a },
    { 0x745096ad,	0x3a8 },	{ 0x74866229,	0x4e8c },	{ 0x77185fa5,	0x3a8 },	{ 0x7953f002,	0x6faf },
    { 0x7953f003,	0x6fb0 },	{ 0x7953f004,	0x6fb1 },	{ 0x7953f005,	0x6fb2 },	{ 0x7953f006,	0x6fb7 },
    { 0x7953f00a,	0x6fbd },	{ 0x7c577571,	0x2761 },	{ 0x7e8c8ff1,	0x479 },	{ 0x8031f47f,	0x3b5 },
    { 0x8031f481,	0x3b5 },	{ 0x80c4a710,	0x5187 },	{ 0x857c7e14,	0xfde8 },	{ 0x857c7e15,	0xfde9 },
    { 0x86b59c90,	0x4e4 },	{ 0x86b59c91,	0x6fb0 },	{ 0x86b59c92,	0x6fb1 },	{ 0x86b59c93,	0x6fb2 },
    { 0x86b59c94,	0x6fb3 },	{ 0x86b59c95,	0x6fb4 },	{ 0x86b59c96,	0x6fb5 },	{ 0x86b59c97,	0x4e7 },
    { 0x86b59c98,	0x4e6 },	{ 0x8b4b24ec,	0x5190 },	{ 0x8face362,	0x4e4 },	{ 0x8ff9ec2a,	0xfde9 },
    { 0x919d3989,	0xcadc },	{ 0x9967e5ad,	0x4e22 },	{ 0x99f8b933,	0x6fbd },	{ 0x9bd2a380,	0x4fc7 },
    { 0x9befad23,	0x4f38 },	{ 0x9c7ac649,	0x4f3c },	{ 0xa02468db,	0xdeae },	{ 0xa02468ec,	0xdeab },
    { 0xa024692a,	0xdeaa },	{ 0xa0246997,	0xdeb2 },	{ 0xa02469ff,	0xdeb0 },	{ 0xa0246a3d,	0xdeb1 },
    { 0xa0246a8c,	0xdeaf },	{ 0xa0246a9a,	0xdeb3 },	{ 0xa0246b16,	0xdeac },	{ 0xa0246b1a,	0xdead },
    { 0xa071addc,	0x4b1 },	{ 0xa38b62dc,	0x474 },	{ 0xa4c09fed,	0x3a8 },	{ 0xa51e86e5,	0x4e7 },
    { 0xa67ab13e,	0x3a4 },	{ 0xa7414244,	0x51a9 },	{ 0xa9ddbead,	0xc6fb },	{ 0xab24ffab,	0x4e8a },
    { 0xabef8ac4,	0x2710 },	{ 0xabfa20ac,	0x6fb4 },	{ 0xad36895e,	0x4e2 },	{ 0xad36895f,	0x4e3 },
    { 0xaf310e90,	0x402 },	{ 0xaf31166f,	0x4e8 },	{ 0xaf7277a5,	0x3b6 },	{ 0xafc0d8b3,	0x96c6 },
    { 0xb0fd5dba,	0xcae0 },	{ 0xb0fd5e95,	0xcadc },	{ 0xb1052893,	0x7149 },	{ 0xb1e98745,	0x36a },
    { 0xb277e91c,	0x5166 },	{ 0xb2f7eac5,	0xcae0 },	{ 0xb2f7eba0,	0xcadc },	{ 0xb2f7ebc1,	0x3b5 },
    { 0xb53fa77d,	0x3a8 },	{ 0xb6391138,	0x6fb5 },	{ 0xb7358b7f,	0x6fb6 },	{ 0xb8c42b40,	0x4e4 },
    { 0xb8c42ea4,	0x1b5 },	{ 0xb8c439e7,	0x2e1 },	{ 0xb8c43a61,	0x307 },	{ 0xb8c43d6c,	0x4e4 },
    { 0xb8c43ddf,	0x352 },	{ 0xb8c43de1,	0x354 },	{ 0xb8c43de6,	0x359 },	{ 0xb8c43dff,	0x35d },
    { 0xb8c43e04,	0x362 },	{ 0xb8c43e07,	0x365 },	{ 0xbcd29a7f,	0x3a8 },	{ 0xbce34e78,	0x5182 },
    { 0xbce34e7b,	0x556a },	{ 0xbce81504,	0x3b5 },	{ 0xbd8a4c95,	0x272d },	{ 0xbdd89dad,	0x4e4 },
    { 0xbdd89dae,	0x6fb0 },	{ 0xbdd89daf,	0x6fb1 },	{ 0xbdd89db0,	0x6fb2 },	{ 0xbdd89db1,	0x4e6 },
    { 0xbdd89db5,	0x6fbd },	{ 0xc1756e9f,	0x36b },	{ 0xc7482444,	0x47a },	{ 0xc9281c18,	0x4e4 },
    { 0xc9ef95df,	0x47b },	{ 0xccc9db0d,	0x4e4 },	{ 0xccc9db0e,	0x6fb0 },	{ 0xcd73425f,	0x3b6 },
    { 0xce38b40b,	0x4b0 },	{ 0xce99e549,	0x25 },		{ 0xcf598740,	0x4e7 },	{ 0xcf6d6f78,	0x4e4 },
    { 0xcf758df6,	0x3a4 },	{ 0xd1266e51,	0x6fb5 },	{ 0xd2910213,	0x2718 },	{ 0xd29196bb,	0x2712 },
    { 0xd3eb2fc2,	0x476 },	{ 0xd442dc2c,	0x4fc4 },	{ 0xd9da4da4,	0x2711 },	{ 0xdbad2f42,	0x4e4 },
    { 0xdbad2f43,	0x6fb0 },	{ 0xdbad2f44,	0x6fb1 },	{ 0xdbad2f45,	0x6fb2 },	{ 0xdbad2f46,	0x6fb3 },
    { 0xdbad2f47,	0x6fb4 },	{ 0xdbad2f48,	0x6fb5 },	{ 0xdbad2f49,	0x6fb6 },	{ 0xdbad2f4a,	0x4e6 },
    { 0xdc438033,	0x4f31 },	{ 0xdccb439b,	0x477 },	{ 0xdccdc626,	0x3b5 },	{ 0xdd80a595,	0x4e4 },
    { 0xdd80a596,	0x6fb0 },	{ 0xdd80a59e,	0x6fb1 },	{ 0xdd80a5b4,	0x6fb2 },	{ 0xdd80a5d9,	0x6fb5 },
    { 0xdd80a5da,	0x6fb4 },	{ 0xdd80a5fa,	0x6fb6 },	{ 0xdd80a615,	0x6fb3 },	{ 0xdd80a619,	0x4e6 },
    { 0xdd80a61a,	0x3b5 },	{ 0xdd80c0f8,	0x4e9f },	{ 0xdf7e46ff,	0x4fc8 },	{ 0xdf8680fd,	0x556a },
    { 0xdfb0bd6e,	0xc42d },	{ 0xdff05486,	0x2c4 },	{ 0xe3323399,	0x3a4 },	{ 0xe60412dd,	0x3b5 },
    { 0xeee47add,	0x4b0 },	{ 0xf021a186,	0x4e2 },	{ 0xf021a187,	0x4e3 },	{ 0xf021a188,	0x4e4 },
    { 0xf021a189,	0x4e5 },	{ 0xf021a18a,	0x4e6 },	{ 0xf021a18b,	0x4e7 },	{ 0xf021a18c,	0x4e8 },
    { 0xf021a18d,	0x4e9 },	{ 0xf021a18e,	0x4ea },	{ 0xf0700456,	0x6fb3 },	{ 0xf274f175,	0x3b5 },
    { 0xf2a9730b,	0x3a8 },	{ 0xf3d463c2,	0x3a4 },	{ 0xf52a70a3,	0xc42e },	{ 0xf5693147,	0x6fb3 },
    { 0xf637e157,	0x478 },	{ 0xfc213f3a,	0x2717 },	{ 0xff654d14,	0x3b5 },
};
FX_WORD FX_GetCodePageFromStringA(const FX_CHAR* pStr, int32_t iLength)
{
    FXSYS_assert(pStr != NULL);
    if (iLength < 0) {
        iLength = FXSYS_strlen(pStr);
    }
    if (iLength == 0) {
        return 0xFFFF;
    }
    uint32_t uHash = FX_HashCode_String_GetA(pStr, iLength, TRUE);
    int32_t iStart = 0, iMid;
    int32_t iEnd = sizeof(g_FXCPHashTable) / sizeof(FX_STR2CPHASH) - 1;
    FXSYS_assert(iEnd >= 0);
    do {
        iMid = (iStart + iEnd) / 2;
        const FX_STR2CPHASH & cp = g_FXCPHashTable[iMid];
        if (uHash == cp.uHash) {
            return (FX_WORD)cp.uCodePage;
        } else if (uHash < cp.uHash) {
            iEnd = iMid - 1;
        } else {
            iStart = iMid + 1;
        }
    } while (iStart <= iEnd);
    return 0xFFFF;
}
FX_WORD FX_GetCodePageFormStringW(const FX_WCHAR* pStr, int32_t iLength)
{
    if (iLength < 0) {
        iLength = FXSYS_wcslen(pStr);
    }
    if (iLength == 0) {
        return 0xFFFF;
    }
    CFX_ByteString csStr;
    FX_CHAR* pBuf = csStr.GetBuffer(iLength + 1);
    for (int32_t i = 0; i < iLength; ++i) {
        *pBuf ++ = (FX_CHAR) * pStr ++;
    }
    csStr.ReleaseBuffer(iLength);
    return FX_GetCodePageFromStringA(csStr, iLength);
}