1763 lines
84 KiB
ObjectPascal
1763 lines
84 KiB
ObjectPascal
{
|
|
HtmlViewer Version 11.7
|
|
Copyright (c) 2010-2016 by Bernd Gabriel
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
this software and associated documentation files (the "Software"), to deal in
|
|
the Software without restriction, including without limitation the rights to
|
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
of the Software, and to permit persons to whom the Software is furnished to do
|
|
so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
Note that the source modules HTMLGIF1.PAS and DITHERUNIT.PAS
|
|
are covered by separate copyright notices located in those modules.
|
|
}
|
|
|
|
{$I frxHTMLCons.inc}
|
|
|
|
unit frxHTMLBuffer;
|
|
|
|
interface
|
|
|
|
{Important: Be sure to list LclType after SysUtils and Classes
|
|
in order to use LclType's THandle declaration (32 or 64 bits)
|
|
rather than THandle in SysUtils and Classes (=System.THandle,
|
|
which apparently is always 32 bits).}
|
|
uses
|
|
{$ifdef LCL}
|
|
Classes, SysUtils,
|
|
LclIntf, LclType, frxHTMLMisc,
|
|
{$else}
|
|
Windows,
|
|
Classes, SysUtils,
|
|
{$endif}
|
|
Graphics,
|
|
{$ifdef UNICODE}
|
|
AnsiStrings,
|
|
{$endif}
|
|
//
|
|
frxHTMLGlobals;
|
|
|
|
type
|
|
EConversionError = class(Exception);
|
|
|
|
TBuffCodePage = LongInt;
|
|
TBuffCharSet = SmallInt; // slightly more than a TFontCharset.
|
|
|
|
TBuffChar = ThtChar; // the type of a wide char
|
|
PBuffChar = PhtChar;
|
|
TBuffString = ThtString; // the type of a wide string
|
|
TBuffStringList = ThtStringList; // the type of a wide string
|
|
|
|
TBuffPointer = record
|
|
case Integer of
|
|
0: (BytePtr: PByte;);
|
|
1: (WordPtr: PWord;);
|
|
2: (AnsiChr: PAnsiChar;);
|
|
3: (WideChr: PWideChar;);
|
|
end;
|
|
|
|
TBuffConverter = class
|
|
protected
|
|
FPos, FEnd: TBuffPointer;
|
|
FCodePage, FInitalCodePage: TBuffCodePage;
|
|
function GetNext: Word;
|
|
procedure Assign(Source: TBuffConverter); virtual;
|
|
public
|
|
constructor Create(CurrPtr, EndPtr: TBuffPointer; CodePage, InitalCodePage: TBuffCodePage); virtual;
|
|
constructor CreateCopy(Source: TBuffConverter); overload;
|
|
|
|
function NextChar: TBuffChar; virtual;
|
|
function PeekChar: TBuffChar;
|
|
function AsString: TBuffString; virtual;
|
|
property CodePage: TBuffCodePage read FCodePage;
|
|
end;
|
|
TBuffConverterClass = class of TBuffConverter;
|
|
|
|
TBuffArray = array of Byte;
|
|
TBuffArray4 = array [0..3] of Byte;
|
|
|
|
// BG, 11.11.2011: Issue 93: LoadStrings failure
|
|
TBufferState = set of (
|
|
bsFixedCodePage // ignore writing to property CodePage.
|
|
// Helps to ignore <META http-equiv="Content-Type" ...>,
|
|
// if buffer is an already converted TBuffString.
|
|
);
|
|
|
|
// BG, 17.12.2010: helps converting any kind of stream to WideChars.
|
|
//
|
|
// Although loading files via ThtStringList.LoadFromFile(FileName) produces WideChars,
|
|
// these WideChars may not be coded correctly, if the file is not a unicode file.
|
|
// For those cases you can apply a CodePage to the TBuffString versions of Convert()/Create().
|
|
// Or you can used the PByte versions with the InitialCodePage parameters and set InitialCodePage to CP_UTF16LE.
|
|
//
|
|
// Avoid passing such raw ThtStringList.Text to HtmlViewer.
|
|
// HtmlViewer assumes correct unicode in ThtString.
|
|
// You MUST convert it before passing it to HtmlViewer: HtmlViewer.LoadFromString(TBuffer.Convert(StringList.Text, CodePage));
|
|
// Or you let HtmlViewer load it from file or a TFileStream.
|
|
//
|
|
TBuffer = class
|
|
private
|
|
FBuffer: TBuffArray;
|
|
FStart: TBuffPointer;
|
|
FEnd: TBuffPointer;
|
|
FName: TBuffString;
|
|
FConverter: TBuffConverter;
|
|
FState: TBufferState;
|
|
FBomLength: Cardinal;
|
|
|
|
function GetCodePage: TBuffCodePage; {$ifdef UseInline} inline; {$endif}
|
|
function GetPosition: Integer; {$ifdef UseInline} inline; {$endif}
|
|
procedure DetectCodePage;
|
|
procedure Reset;
|
|
procedure SetCodePage(Value: TBuffCodePage); {$ifdef UseInline} inline; {$endif}
|
|
procedure SetCodePages(Value, Initial: TBuffCodePage);
|
|
procedure SetPosition(const Value: Integer); {$ifdef UseInline} inline; {$endif}
|
|
procedure SetStream(Stream: TStream); {$ifdef UseInline} inline; {$endif}
|
|
public
|
|
class function Convert(Text: PByte; ByteCount: Integer; CodePage, InitialCodePage: TBuffCodePage): TBuffString; overload; {$ifdef UseInline} inline; {$endif}
|
|
class function Convert(Text: PByte; ByteCount: Integer; CodePage: TBuffCodePage): TBuffString; overload; {$ifdef UseInline} inline; {$endif}
|
|
class function Convert(const Text: TBuffString; CodePage: TBuffCodePage): TBuffString; overload; {$ifdef UseInline} inline; {$endif}
|
|
constructor Create(const Doc: TBuffer); overload;
|
|
constructor Create(Stream: TStream; CodePage: TBuffCodePage; Name: TBuffString = ''); overload;
|
|
constructor Create(Stream: TStream; Name: TBuffString = ''); overload;
|
|
constructor Create(Text: PByte; ByteCount: Integer; CodePage, InitialCodePage: TBuffCodePage; const Name: TBuffString = ''); overload;
|
|
constructor Create(Text: PByte; ByteCount: Integer; CodePage: TBuffCodePage; const Name: TBuffString = ''); overload;
|
|
constructor Create(const Text: TBuffString; CodePage: TBuffCodePage; const Name: TBuffString = ''); overload;
|
|
constructor Create(const Text: TBuffString; const Name: TBuffString = ''; CodePage: TBuffCodePage = CP_UTF16LE); overload;
|
|
destructor Destroy; override;
|
|
function AsString: TBuffString; {$ifdef UseInline} inline; {$endif}
|
|
function GetString(FromIndex, UntilIndex: Integer): TBuffString;
|
|
function NextChar: TBuffChar; {$ifdef UseInline} inline; {$endif}
|
|
function PeekChar: TBuffChar; {$ifdef UseInline} inline; {$endif}
|
|
function Size: Integer; {$ifdef UseInline} inline; {$endif}
|
|
procedure Assign(Source: TBuffer); virtual;
|
|
procedure AssignTo(Destin: TObject); virtual;
|
|
property CodePage: TBuffCodePage read GetCodePage write SetCodePage;
|
|
property Name: TBuffString read FName;
|
|
property Position: Integer read GetPosition write SetPosition;
|
|
property BomLength: Cardinal read FBomLength;
|
|
end;
|
|
|
|
// BG, 13.10.2012: Code Page Management
|
|
//
|
|
// You can register your own code page to unicode converters or unregister your own or predefined converters.
|
|
// Registering an existing converter again updates it.
|
|
//
|
|
// As each code page may have any number of aliases there are 2 sets of un-/register methods.
|
|
// One to register a code page name to code page number mappings and
|
|
// one to register the converter.
|
|
|
|
// Add a name of a code page. Code pages can have many names, but each name names one code page only:
|
|
procedure RegisterCodePageName(const CodePageName: TBuffString; CodePage: TBuffCodePage);
|
|
// Remove a name of a code page:
|
|
procedure UnregisterCodePageName(const CodePageName: TBuffString);
|
|
// Get code page by name:
|
|
function StrToCodePage(const CodePageName: TBuffString): TBuffCodePage;
|
|
|
|
// Add a code page to unicode converter. Only one converter per code page is allowed,
|
|
// but a converter may handle more than one code page:
|
|
procedure RegisterCodePageToUnicodeConverter(
|
|
CodePage: TBuffCodePage; Converter: TBuffConverterClass;
|
|
const ConverterName: TBuffString = ''; CharSet: TBuffCharSet = UNKNOWN_CHARSET);
|
|
// Remove a code page to unicode converter:
|
|
procedure UnregisterCodePageToUnicodeConverter(CodePage: TBuffCodePage);
|
|
// Get charset of code page:
|
|
function CodePageToCharSet(CodePage: TBuffCodePage): TBuffCharSet;
|
|
|
|
implementation
|
|
|
|
uses
|
|
frxHTMLBuffConv;
|
|
|
|
type
|
|
|
|
TBuffConvInfo = class
|
|
private
|
|
FName: TBuffString;
|
|
FCodePage: TBuffCodePage;
|
|
FCharSet: TBuffCharSet;
|
|
FConverter: TBuffConverterClass;
|
|
public
|
|
constructor Create(CodePage: TBuffCodePage; CharSet: TBuffCharSet; Converter: TBuffConverterClass; const Name: TBuffString);
|
|
property CharSet: TBuffCharSet read FCharSet;
|
|
property CodePage: TBuffCodePage read FCodePage;
|
|
property Converter: TBuffConverterClass read FConverter;
|
|
property Name: TBuffString read FName;
|
|
end;
|
|
|
|
TBuffConvInfoList = class(TList)
|
|
private
|
|
FSorted: Boolean;
|
|
function GetItem(Index: Integer): TBuffConvInfo;
|
|
protected
|
|
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
|
|
public
|
|
constructor Create;
|
|
procedure Add(Item: TBuffConvInfo);
|
|
function Find(CodePage: TBuffCodePage): Integer;
|
|
procedure Sort;
|
|
property Items[Index: Integer]: TBuffConvInfo read GetItem; default;
|
|
property Sorted: Boolean read FSorted;
|
|
end;
|
|
|
|
TBuffCodePageName = class
|
|
private
|
|
FName: TBuffString;
|
|
FCodePage: TBuffCodePage;
|
|
public
|
|
constructor Create(Name: TBuffString; CodePage: TBuffCodePage);
|
|
property CodePage: TBuffCodePage read FCodePage;
|
|
property Name: TBuffString read FName;
|
|
end;
|
|
|
|
TBuffCodePageNameList = class(TBuffStringList)
|
|
private
|
|
function GetItem(Index: Integer): TBuffCodePageName;
|
|
public
|
|
constructor Create;
|
|
destructor Destroy; override;
|
|
procedure Add(Info: TBuffCodePageName); reintroduce;
|
|
function IndexOf(const S: TBuffString): Integer; override;
|
|
property Items[Index: Integer]: TBuffCodePageName read GetItem; default;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 22.12.2010 --
|
|
var
|
|
VFinalizing: Boolean;
|
|
VConvertersByCodePage: TBuffConvInfoList;
|
|
VCodePagesByName: TBuffCodePageNameList;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
function GetCodePageNameList: TBuffCodePageNameList;
|
|
begin
|
|
if (VCodePagesByName = nil) and not VFinalizing then
|
|
VCodePagesByName := TBuffCodePageNameList.Create;
|
|
Result := VCodePagesByName;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
procedure RegisterCodePageName(const CodePageName: TBuffString; CodePage: TBuffCodePage);
|
|
var
|
|
CodePagesByName: TBuffCodePageNameList;
|
|
begin
|
|
CodePagesByName := GetCodePageNameList;
|
|
if CodePagesByName <> nil then
|
|
CodePagesByName.Add(TBuffCodePageName.Create(CodePageName, CodePage));
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
procedure UnregisterCodePageName(const CodePageName: TBuffString);
|
|
var
|
|
CodePagesByName: TBuffCodePageNameList;
|
|
Index: Integer;
|
|
begin
|
|
CodePagesByName := GetCodePageNameList;
|
|
if CodePagesByName <> nil then
|
|
begin
|
|
Index := -1;
|
|
if not CodePagesByName.Find(CodePageName, Index) then
|
|
Index := CodePagesByName.IndexOf(CodePageName);
|
|
if Index >= 0 then
|
|
begin
|
|
CodePagesByName[Index].Free;
|
|
CodePagesByName.Delete(Index);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 22.12.2010 --
|
|
function StrToCodePageInfo(const CodePageName: TBuffString): TBuffCodePageName;
|
|
var
|
|
CodePagesByName: TBuffCodePageNameList;
|
|
Index: Integer;
|
|
begin
|
|
CodePagesByName := GetCodePageNameList;
|
|
Result := nil;
|
|
if CodePagesByName <> nil then
|
|
begin
|
|
Index := -1;
|
|
if not CodePagesByName.Find(CodePageName, Index) then
|
|
Index := CodePagesByName.IndexOf(CodePageName);
|
|
if Index >= 0 then
|
|
Result := CodePagesByName[Index];
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
function StrToCodePage(const CodePageName: TBuffString): TBuffCodePage;
|
|
var
|
|
Info: TBuffCodePageName;
|
|
begin
|
|
Info := StrToCodePageInfo(CodePageName);
|
|
if Info <> nil then
|
|
Result := Info.CodePage
|
|
else
|
|
Result := CP_UNKNOWN;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
function GetConvInfoList: TBuffConvInfoList;
|
|
begin
|
|
if (VConvertersByCodePage = nil) and not VFinalizing then
|
|
VConvertersByCodePage := TBuffConvInfoList.Create;
|
|
Result := VConvertersByCodePage;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
procedure RegisterCodePageToUnicodeConverter(
|
|
CodePage: TBuffCodePage; Converter: TBuffConverterClass;
|
|
const ConverterName: TBuffString = ''; CharSet: TBuffCharSet = UNKNOWN_CHARSET);
|
|
var
|
|
Index: Integer;
|
|
CodePageInfos: TBuffConvInfoList;
|
|
CodePageInfo: TBuffConvInfo;
|
|
begin
|
|
CodePageInfos := GetConvInfoList;
|
|
if CodePageInfos <> nil then
|
|
begin
|
|
Index := CodePageInfos.Find(CodePage);
|
|
if Index >= 0 then
|
|
begin
|
|
// update existing code page
|
|
CodePageInfo := CodePageInfos[Index];
|
|
CodePageInfo.FName := ConverterName;
|
|
CodePageInfo.FCharSet := CharSet;
|
|
CodePageInfo.FConverter := Converter;
|
|
end
|
|
else
|
|
// Add new code page
|
|
CodePageInfos.Add(TBuffConvInfo.Create(CodePage, CharSet, Converter, ConverterName));
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
procedure UnregisterCodePageToUnicodeConverter(CodePage: TBuffCodePage);
|
|
var
|
|
Index: Integer;
|
|
CodePageInfos: TBuffConvInfoList;
|
|
begin
|
|
CodePageInfos := GetConvInfoList;
|
|
if CodePageInfos <> nil then
|
|
begin
|
|
Index := CodePageInfos.Find(CodePage);
|
|
if Index >= 0 then
|
|
CodePageInfos.Delete(Index);
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 14.12.2010 --
|
|
function CodePageToCharSet(CodePage: TBuffCodePage): TBuffCharSet;
|
|
var
|
|
Index: Integer;
|
|
CodePageInfos: TBuffConvInfoList;
|
|
begin
|
|
Result := UNKNOWN_CHARSET;
|
|
CodePageInfos := GetConvInfoList;
|
|
if CodePageInfos <> nil then
|
|
begin
|
|
Index := CodePageInfos.Find(CodePage);
|
|
if Index >= 0 then
|
|
Result := CodePageInfos[Index].CharSet;
|
|
end;
|
|
|
|
if Result = UNKNOWN_CHARSET then
|
|
//raise EConversionError.CreateFmt('Don''t know equivalent char set for code page %d.', [CodePage]);
|
|
Result := DEFAULT_CHARSET;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 15.07.2012 --
|
|
function StrNCmpA(Str1, Str2: PAnsiChar; N: Integer): Integer;
|
|
var
|
|
StrEnd: PAnsiChar;
|
|
begin
|
|
StrEnd := Str1 + N;
|
|
while Str1 < StrEnd do
|
|
begin
|
|
Result := Ord(Str1^) - Ord(Str2^);
|
|
if (Result <> 0) or (Str1^ = #0) then
|
|
Exit;
|
|
Inc(Str1);
|
|
Inc(Str2);
|
|
end;
|
|
Result := 0;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 15.07.2012 --
|
|
function StrNPosA(Str, SubStr: PAnsiChar; N: Integer): PAnsiChar;
|
|
// returns a pointer to the first occurrence of SubStr in the first N chars of Str.
|
|
// Finds SubStr only, if the entire SubStr is within the first N chars.
|
|
// Example:
|
|
// StrNPosA('expression', 'press', 7) finds pointer to 'pression' while
|
|
// StrNPosA('expression', 'press', 6) retuns nil, as 'press' is not in the first 6 chars ('expres').
|
|
var
|
|
L: Integer;
|
|
StrEnd: PAnsiChar;
|
|
begin
|
|
StrEnd := SubStr;
|
|
while StrEnd^ <> #0 do
|
|
Inc(StrEnd);
|
|
L := StrEnd - SubStr;
|
|
if L > 0 then // Make sure substring not null string and SubStr fits into Str at all.
|
|
begin
|
|
Result := Str;
|
|
StrEnd := Str + N - L;
|
|
while (Result < StrEnd) and (Result^ <> #0) do
|
|
begin
|
|
if StrNCmpA(Result, SubStr, L) = 0 then
|
|
Exit;
|
|
Inc(Result);
|
|
end;
|
|
end;
|
|
Result := nil;
|
|
end;
|
|
|
|
{ TBuffConvInfo }
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
constructor TBuffConvInfo.Create(CodePage: TBuffCodePage; CharSet: TBuffCharSet; Converter: TBuffConverterClass; const Name: TBuffString);
|
|
begin
|
|
inherited Create;
|
|
FName := Name;
|
|
FCodePage := CodePage;
|
|
FCharSet := CharSet;
|
|
FConverter := Converter;
|
|
end;
|
|
|
|
{ TBuffConvInfoList }
|
|
|
|
function CompareConvInfo(Item1, Item2: Pointer): Integer;
|
|
var
|
|
Info1: TBuffConvInfo absolute Item1;
|
|
Info2: TBuffConvInfo absolute Item2;
|
|
begin
|
|
Result := Info1.CodePage - Info2.CodePage;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
procedure TBuffConvInfoList.Add(Item: TBuffConvInfo);
|
|
begin
|
|
inherited Add(Item);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
constructor TBuffConvInfoList.Create;
|
|
begin
|
|
inherited Create;
|
|
Add(TBuffConvInfo.Create(CP_UNKNOWN, UNKNOWN_CHARSET, TBuffConvSingleByte, 'Unknown'));
|
|
Add(TBuffConvInfo.Create( CP_ACP, DEFAULT_CHARSET, TBuffConvSingleByte, 'Default ANSI CP'));
|
|
Add(TBuffConvInfo.Create( CP_OEMCP, OEM_CHARSET, TBuffConvSingleByte, 'Default OEM CP'));
|
|
Add(TBuffConvInfo.Create( CP_MACCP, MAC_CHARSET, TBuffConvSingleByte, 'Default MAC CP'));
|
|
Add(TBuffConvInfo.Create( 37, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC US-Canada'));
|
|
Add(TBuffConvInfo.Create( 437, ANSI_CHARSET, TBuffConvHighMap, 'OEM United States'));
|
|
Add(TBuffConvInfo.Create( 500, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC International'));
|
|
Add(TBuffConvInfo.Create( 708, ARABIC_CHARSET, TBuffConvHighMap, 'Arabic (ASMO 708)'));
|
|
Add(TBuffConvInfo.Create( 709, ARABIC_CHARSET, TBuffConvSingleByte, 'Arabic (ASMO-449+, BCON V4)'));
|
|
Add(TBuffConvInfo.Create( 710, ARABIC_CHARSET, TBuffConvSingleByte, 'Arabic - Transparent Arabic'));
|
|
Add(TBuffConvInfo.Create( 720, ARABIC_CHARSET, TBuffConvSingleByte, 'Arabic (Transparent ASMO); Arabic (DOS)'));
|
|
Add(TBuffConvInfo.Create( 737, GREEK_CHARSET, TBuffConvHighMap, 'OEM Greek (formerly 437G); Greek (DOS)'));
|
|
Add(TBuffConvInfo.Create( 775, BALTIC_CHARSET, TBuffConvHighMap, 'OEM Baltic; Baltic (DOS)'));
|
|
Add(TBuffConvInfo.Create( 850, ANSI_CHARSET, TBuffConvHighMap, 'OEM Multilingual Latin 1; Western European (DOS)'));
|
|
Add(TBuffConvInfo.Create( 852, EASTEUROPE_CHARSET, TBuffConvHighMap, 'OEM Latin 2; Central European (DOS)'));
|
|
Add(TBuffConvInfo.Create( 855, RUSSIAN_CHARSET, TBuffConvHighMap, 'OEM Cyrillic (primarily Russian)'));
|
|
Add(TBuffConvInfo.Create( 857, TURKISH_CHARSET, TBuffConvHighMap, 'OEM Turkish; Turkish (DOS)'));
|
|
Add(TBuffConvInfo.Create( 858, ANSI_CHARSET, TBuffConvSingleByte, 'OEM Multilingual Latin 1 + Euro symbol'));
|
|
Add(TBuffConvInfo.Create( 860, ANSI_CHARSET, TBuffConvHighMap, 'OEM Portuguese; Portuguese (DOS)'));
|
|
Add(TBuffConvInfo.Create( 861, ANSI_CHARSET, TBuffConvHighMap, 'OEM Icelandic; Icelandic (DOS)'));
|
|
Add(TBuffConvInfo.Create( 862, HEBREW_CHARSET, TBuffConvHighMap, 'OEM Hebrew; Hebrew (DOS)'));
|
|
Add(TBuffConvInfo.Create( 863, ANSI_CHARSET, TBuffConvHighMap, 'OEM French Canadian; French Canadian (DOS)'));
|
|
Add(TBuffConvInfo.Create( 864, ARABIC_CHARSET, TBuffConvHighMap, 'OEM Arabic; Arabic (864)'));
|
|
Add(TBuffConvInfo.Create( 865, ANSI_CHARSET, TBuffConvHighMap, 'OEM Nordic; Nordic (DOS)'));
|
|
Add(TBuffConvInfo.Create( 866, RUSSIAN_CHARSET, TBuffConvHighMap, 'OEM Russian; Cyrillic (DOS)'));
|
|
Add(TBuffConvInfo.Create( 869, GREEK_CHARSET, TBuffConvHighMap, 'OEM Modern Greek; Greek, Modern (DOS)'));
|
|
Add(TBuffConvInfo.Create( 870, EASTEUROPE_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Multilingual/ROECE (Latin 2); IBM EBCDIC Multilingual Latin 2'));
|
|
Add(TBuffConvInfo.Create( 874, THAI_CHARSET, TBuffConvHighMap, 'ANSI/OEM Thai (same as 28605, ISO 8859-15); Thai (Windows)'));
|
|
Add(TBuffConvInfo.Create( 875, GREEK_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Greek Modern'));
|
|
Add(TBuffConvInfo.Create( 922, BALTIC_CHARSET, TBuffConvSingleByte, 'ANSI/OEM Estonian (DOS)'));
|
|
Add(TBuffConvInfo.Create( 932, SHIFTJIS_CHARSET, TBuffConvShiftJis932, 'ANSI/OEM Japanese; Japanese (Shift-JIS)'));
|
|
Add(TBuffConvInfo.Create( 936, GB2312_CHARSET, TBuffConvIBM936, 'ANSI/OEM Simplified Chinese (PRC, Singapore); Chinese Simplified (GB2312)'));
|
|
Add(TBuffConvInfo.Create( 943, SHIFTJIS_CHARSET, TBuffConvShiftJis932, 'ANSI/OEM Japanese (Shift-JIS)'));
|
|
Add(TBuffConvInfo.Create( 949, HANGEUL_CHARSET, TBuffConvHangeul949, 'ANSI/OEM Korean (Unified Hangul Code)'));
|
|
Add(TBuffConvInfo.Create( 950, CHINESEBIG5_CHARSET, TBuffConvBig5CP950, 'ANSI/OEM Traditional Chinese (Taiwan; Hong Kong SAR, PRC); Chinese Traditional (Big5)'));
|
|
Add(TBuffConvInfo.Create( 1026, TURKISH_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Turkish (Latin 5)'));
|
|
Add(TBuffConvInfo.Create( 1047, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Latin 1/Open System'));
|
|
Add(TBuffConvInfo.Create( 1140, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC US-Canada (037 + Euro symbol); IBM EBCDIC (US-Canada-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1141, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Germany (20273 + Euro symbol); IBM EBCDIC (Germany-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1142, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Denmark-Norway (20277 + Euro symbol); IBM EBCDIC (Denmark-Norway-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1143, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Finland-Sweden (20278 + Euro symbol); IBM EBCDIC (Finland-Sweden-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1144, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Italy (20280 + Euro symbol); IBM EBCDIC (Italy-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1145, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Latin America-Spain (20284 + Euro symbol); IBM EBCDIC (Spain-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1146, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC United Kingdom (20285 + Euro symbol); IBM EBCDIC (UK-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1147, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC France (20297 + Euro symbol); IBM EBCDIC (France-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1148, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC International (500 + Euro symbol); IBM EBCDIC (International-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1149, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Icelandic (20871 + Euro symbol); IBM EBCDIC (Icelandic-Euro)'));
|
|
Add(TBuffConvInfo.Create( 1200, DEFAULT_CHARSET, TBuffConverter, 'Unicode UTF-16, little endian byte order (BMP of ISO 10646); available only to managed applications'));
|
|
Add(TBuffConvInfo.Create( 1201, DEFAULT_CHARSET, TBuffConverter, 'Unicode UTF-16, big endian byte order; available only to managed applications'));
|
|
Add(TBuffConvInfo.Create( 1250, EASTEUROPE_CHARSET, TBuffConvHighMap, 'ANSI Central European; Central European (Windows)'));
|
|
Add(TBuffConvInfo.Create( 1251, RUSSIAN_CHARSET, TBuffConvHighMap, 'ANSI Cyrillic; Cyrillic (Windows)'));
|
|
Add(TBuffConvInfo.Create( 1252, ANSI_CHARSET, TBuffConvHighMap, 'ANSI Latin 1; Western European (Windows)'));
|
|
Add(TBuffConvInfo.Create( 1253, GREEK_CHARSET, TBuffConvHighMap, 'ANSI Greek; Greek (Windows)'));
|
|
Add(TBuffConvInfo.Create( 1254, TURKISH_CHARSET, TBuffConvHighMap, 'ANSI Turkish; Turkish (Windows)'));
|
|
Add(TBuffConvInfo.Create( 1255, HEBREW_CHARSET, TBuffConvHighMap, 'ANSI Hebrew; Hebrew (Windows)'));
|
|
Add(TBuffConvInfo.Create( 1256, ARABIC_CHARSET, TBuffConvHighMap, 'ANSI Arabic; Arabic (Windows)'));
|
|
Add(TBuffConvInfo.Create( 1257, BALTIC_CHARSET, TBuffConvHighMap, 'ANSI Baltic; Baltic (Windows)'));
|
|
Add(TBuffConvInfo.Create( 1258, VIETNAMESE_CHARSET, TBuffConvHighMap, 'ANSI/OEM Vietnamese; Vietnamese (Windows)'));
|
|
Add(TBuffConvInfo.Create( 1361, JOHAB_CHARSET, TBuffConvSingleByte, 'Korean (Johab)'));
|
|
Add(TBuffConvInfo.Create( 10000, ANSI_CHARSET, TBuffConvHighMap, 'MAC Roman; Western European (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10001, SHIFTJIS_CHARSET, TBuffConvSingleByte, 'Japanese (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10002, CHINESEBIG5_CHARSET, TBuffConvSingleByte, 'MAC Traditional Chinese (Big5); Chinese Traditional (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10003, HANGEUL_CHARSET, TBuffConvSingleByte, 'Korean (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10004, ARABIC_CHARSET, TBuffConvHighMap, 'Arabic (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10005, HEBREW_CHARSET, TBuffConvHighMap, 'Hebrew (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10006, GREEK_CHARSET, TBuffConvHighMap, 'Greek (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10007, RUSSIAN_CHARSET, TBuffConvHighMap, 'Cyrillic (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10008, GB2312_CHARSET, TBuffConvSingleByte, 'MAC Simplified Chinese (GB 2312); Chinese Simplified (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10010, EASTEUROPE_CHARSET, TBuffConvHighMap, 'Romanian (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10017, RUSSIAN_CHARSET, TBuffConvHighMap, 'Ukrainian (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10021, THAI_CHARSET, TBuffConvHighMap, 'Thai (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10029, EASTEUROPE_CHARSET, TBuffConvHighMap, 'MAC Latin 2; Central European (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10079, ANSI_CHARSET, TBuffConvHighMap, 'Icelandic (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10081, TURKISH_CHARSET, TBuffConvHighMap, 'Turkish (Mac)'));
|
|
Add(TBuffConvInfo.Create( 10082, EASTEUROPE_CHARSET, TBuffConvHighMap, 'Croatian (Mac)'));
|
|
Add(TBuffConvInfo.Create( 12000, DEFAULT_CHARSET, TBuffConvSingleByte, 'Unicode UTF-32, little endian byte order; available only to managed applications'));
|
|
Add(TBuffConvInfo.Create( 12001, DEFAULT_CHARSET, TBuffConvSingleByte, 'Unicode UTF-32, big endian byte order; available only to managed applications'));
|
|
Add(TBuffConvInfo.Create( 20000, CHINESEBIG5_CHARSET, TBuffConvSingleByte, 'CNS Taiwan; Chinese Traditional (CNS)'));
|
|
Add(TBuffConvInfo.Create( 20001, CHINESEBIG5_CHARSET, TBuffConvSingleByte, 'TCA Taiwan'));
|
|
Add(TBuffConvInfo.Create( 20002, CHINESEBIG5_CHARSET, TBuffConvSingleByte, 'Eten Taiwan; Chinese Traditional (Eten)'));
|
|
Add(TBuffConvInfo.Create( 20003, CHINESEBIG5_CHARSET, TBuffConvSingleByte, 'IBM5550 Taiwan'));
|
|
Add(TBuffConvInfo.Create( 20004, CHINESEBIG5_CHARSET, TBuffConvSingleByte, 'TeleText Taiwan'));
|
|
Add(TBuffConvInfo.Create( 20005, CHINESEBIG5_CHARSET, TBuffConvSingleByte, 'Wang Taiwan'));
|
|
Add(TBuffConvInfo.Create( 20105, ANSI_CHARSET, TBuffConvSingleByte, 'IA5 (IRV International Alphabet No. 5, 7-bit); Western European (IA5)'));
|
|
Add(TBuffConvInfo.Create( 20106, ANSI_CHARSET, TBuffConvSingleByte, 'IA5 German (7-bit)'));
|
|
Add(TBuffConvInfo.Create( 20107, ANSI_CHARSET, TBuffConvSingleByte, 'IA5 Swedish (7-bit)'));
|
|
Add(TBuffConvInfo.Create( 20108, ANSI_CHARSET, TBuffConvSingleByte, 'IA5 Norwegian (7-bit)'));
|
|
Add(TBuffConvInfo.Create( 20127, ANSI_CHARSET, TBuffConvSingleByte, 'US-ASCII (7-bit)'));
|
|
Add(TBuffConvInfo.Create( 20261, ANSI_CHARSET, TBuffConvSingleByte, 'T.61'));
|
|
Add(TBuffConvInfo.Create( 20269, ANSI_CHARSET, TBuffConvSingleByte, 'ISO 6937 Non-Spacing Accent'));
|
|
Add(TBuffConvInfo.Create( 20273, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Germany'));
|
|
Add(TBuffConvInfo.Create( 20277, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Denmark-Norway'));
|
|
Add(TBuffConvInfo.Create( 20278, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Finland-Sweden'));
|
|
Add(TBuffConvInfo.Create( 20280, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Italy'));
|
|
Add(TBuffConvInfo.Create( 20284, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Latin America-Spain'));
|
|
Add(TBuffConvInfo.Create( 20285, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC United Kingdom'));
|
|
Add(TBuffConvInfo.Create( 20290, SHIFTJIS_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Japanese Katakana Extended'));
|
|
Add(TBuffConvInfo.Create( 20297, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC France'));
|
|
Add(TBuffConvInfo.Create( 20420, ARABIC_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Arabic'));
|
|
Add(TBuffConvInfo.Create( 20423, GREEK_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Greek'));
|
|
Add(TBuffConvInfo.Create( 20424, HEBREW_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Hebrew'));
|
|
Add(TBuffConvInfo.Create( 20833, HANGEUL_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Korean Extended'));
|
|
Add(TBuffConvInfo.Create( 20838, THAI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Thai'));
|
|
Add(TBuffConvInfo.Create( 20866, RUSSIAN_CHARSET, TBuffConvHighMap, 'Russian (KOI8-R); Cyrillic (KOI8-R)'));
|
|
Add(TBuffConvInfo.Create( 20871, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Icelandic'));
|
|
Add(TBuffConvInfo.Create( 20880, RUSSIAN_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Cyrillic Russian'));
|
|
Add(TBuffConvInfo.Create( 20905, TURKISH_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Turkish'));
|
|
Add(TBuffConvInfo.Create( 20924, ANSI_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Latin 1/Open System (1047 + Euro symbol)'));
|
|
Add(TBuffConvInfo.Create( 20932, SHIFTJIS_CHARSET, TBuffConvSingleByte, 'Japanese (JIS 0208-1990 and 0121-1990)'));
|
|
Add(TBuffConvInfo.Create( 20936, GB2312_CHARSET, TBuffConvSingleByte, 'Simplified Chinese (GB2312); Chinese Simplified (GB2312-80)'));
|
|
Add(TBuffConvInfo.Create( 20949, HANGEUL_CHARSET, TBuffConvSingleByte, 'Korean Wansung'));
|
|
Add(TBuffConvInfo.Create( 21025, RUSSIAN_CHARSET, TBuffConvSingleByte, 'IBM EBCDIC Cyrillic Serbian-Bulgarian'));
|
|
Add(TBuffConvInfo.Create( 21027, UNKNOWN_CHARSET, TBuffConvSingleByte, '(deprecated)'));
|
|
Add(TBuffConvInfo.Create( 21866, RUSSIAN_CHARSET, TBuffConvSingleByte, 'Ukrainian (KOI8-U); Cyrillic (KOI8-U)'));
|
|
Add(TBuffConvInfo.Create( 28591, ANSI_CHARSET, TBuffConverter, 'ISO 8859-1 Latin 1; Western European (ISO)'));
|
|
Add(TBuffConvInfo.Create( 28592, EASTEUROPE_CHARSET, TBuffConvIsoMap, 'ISO 8859-2 Latin 2; Central European; Central European (ISO)'));
|
|
Add(TBuffConvInfo.Create( 28593, ANSI_CHARSET, TBuffConvIsoMap, 'ISO 8859-3 Latin 3; Southern European'));
|
|
Add(TBuffConvInfo.Create( 28594, ANSI_CHARSET, TBuffConvIsoMap, 'ISO 8859-4 Latin 4; Northern European'));
|
|
Add(TBuffConvInfo.Create( 28595, RUSSIAN_CHARSET, TBuffConvSingleByte, 'ISO 8859-5 Cyrillic'));
|
|
Add(TBuffConvInfo.Create( 28596, ARABIC_CHARSET, TBuffConvSingleByte, 'ISO 8859-6 Arabic'));
|
|
Add(TBuffConvInfo.Create( 28597, GREEK_CHARSET, TBuffConvSingleByte, 'ISO 8859-7 Greek'));
|
|
Add(TBuffConvInfo.Create( 28598, HEBREW_CHARSET, TBuffConvSingleByte, 'ISO 8859-8 Hebrew; Hebrew (ISO-Visual)'));
|
|
Add(TBuffConvInfo.Create( 28599, TURKISH_CHARSET, TBuffConvSingleByte, 'ISO 8859-9 Turkish'));
|
|
Add(TBuffConvInfo.Create( 28600, ANSI_CHARSET, TBuffConvIsoMap, 'ISO 8859-10 Latin 6; Nordic'));
|
|
Add(TBuffConvInfo.Create( 28601, THAI_CHARSET, TBuffConvSingleByte, 'ISO 8859-11 Thai'));
|
|
Add(TBuffConvInfo.Create( 28603, BALTIC_CHARSET, TBuffConvIsoMap, 'ISO 8859-13 Latin 7; Baltic'));
|
|
Add(TBuffConvInfo.Create( 28604, ANSI_CHARSET, TBuffConvIsoMap, 'ISO 8859-14 Latin 8; Celtic'));
|
|
Add(TBuffConvInfo.Create( 28605, ANSI_CHARSET, TBuffConvSingleByte, 'ISO 8859-15 Latin 9; Western European'));
|
|
Add(TBuffConvInfo.Create( 28606, ANSI_CHARSET, TBuffConvIsoMap, 'ISO 8859-16 Latin 10; South Eastern European'));
|
|
Add(TBuffConvInfo.Create( 29001, ANSI_CHARSET, TBuffConvSingleByteMap, 'Europa 3'));
|
|
Add(TBuffConvInfo.Create( 38598, HEBREW_CHARSET, TBuffConvSingleByte, 'ISO 8859-8 Hebrew; Hebrew (ISO-Logical)'));
|
|
Add(TBuffConvInfo.Create( 50220, SHIFTJIS_CHARSET, TBuffConvISO2022JP, 'ISO 2022 Japanese with no halfwidth Katakana; Japanese (JIS)'));
|
|
Add(TBuffConvInfo.Create( 50221, SHIFTJIS_CHARSET, TBuffConvISO2022JP, 'ISO 2022 Japanese with halfwidth Katakana; Japanese (JIS-Allow 1 byte Kana)'));
|
|
Add(TBuffConvInfo.Create( 50222, SHIFTJIS_CHARSET, TBuffConvISO2022JP, 'ISO 2022 Japanese JIS X 0201-1989; Japanese (JIS-Allow 1 byte Kana - SO/SI)'));
|
|
Add(TBuffConvInfo.Create( 50225, HANGEUL_CHARSET, TBuffConvISO2022KR, 'ISO 2022 Korean'));
|
|
Add(TBuffConvInfo.Create( 50227, GB2312_CHARSET, TBuffConvISO2022CN, 'ISO 2022 Simplified Chinese; Chinese Simplified (ISO 2022)'));
|
|
Add(TBuffConvInfo.Create( 50229, CHINESEBIG5_CHARSET, TBuffConvSingleByte, 'ISO 2022 Traditional Chinese'));
|
|
Add(TBuffConvInfo.Create( 50930, SHIFTJIS_CHARSET, TBuffConvSingleByte, 'EBCDIC Japanese (Katakana) Extended'));
|
|
Add(TBuffConvInfo.Create( 50931, ANSI_CHARSET, TBuffConvSingleByte, 'EBCDIC US-Canada and Japanese'));
|
|
Add(TBuffConvInfo.Create( 50933, HANGEUL_CHARSET, TBuffConvSingleByte, 'EBCDIC Korean Extended and Korean'));
|
|
Add(TBuffConvInfo.Create( 50935, GB2312_CHARSET, TBuffConvSingleByte, 'EBCDIC Simplified Chinese Extended and Simplified Chinese'));
|
|
Add(TBuffConvInfo.Create( 50936, GB2312_CHARSET, TBuffConvSingleByte, 'EBCDIC Simplified Chinese'));
|
|
Add(TBuffConvInfo.Create( 50937, CHINESEBIG5_CHARSET, TBuffConvSingleByte, 'EBCDIC US-Canada and Traditional Chinese'));
|
|
Add(TBuffConvInfo.Create( 50939, SHIFTJIS_CHARSET, TBuffConvSingleByte, 'EBCDIC Japanese (Latin) Extended and Japanese'));
|
|
Add(TBuffConvInfo.Create( 51932, SHIFTJIS_CHARSET, TBuffConvEUC_JP, 'EUC Japanese'));
|
|
Add(TBuffConvInfo.Create( 51936, GB2312_CHARSET, TBuffConvDoubleByte, 'EUC Simplified Chinese; Chinese Simplified (EUC)'));
|
|
Add(TBuffConvInfo.Create( 51949, HANGEUL_CHARSET, TBuffConvDoubleByte, 'EUC Korean'));
|
|
Add(TBuffConvInfo.Create( 51950, CHINESEBIG5_CHARSET, TBuffConvBig5CP950, 'EUC Traditional Chinese'));
|
|
Add(TBuffConvInfo.Create( 52936, GB2312_CHARSET, TBuffConvSingleByte, 'HZ-GB2312 Simplified Chinese; Chinese Simplified (HZ)'));
|
|
Add(TBuffConvInfo.Create( 54936, GB2312_CHARSET, TBuffConvGB18030, 'Windows XP and later: GB18030 Simplified Chinese (4 byte); Chinese Simplified (GB18030)'));
|
|
Add(TBuffConvInfo.Create( 57002, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Devanagari'));
|
|
Add(TBuffConvInfo.Create( 57003, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Bengali'));
|
|
Add(TBuffConvInfo.Create( 57004, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Tamil'));
|
|
Add(TBuffConvInfo.Create( 57005, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Telugu'));
|
|
Add(TBuffConvInfo.Create( 57006, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Assamese'));
|
|
Add(TBuffConvInfo.Create( 57007, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Oriya'));
|
|
Add(TBuffConvInfo.Create( 57008, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Kannada'));
|
|
Add(TBuffConvInfo.Create( 57009, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Malayalam'));
|
|
Add(TBuffConvInfo.Create( 57010, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Gujarati'));
|
|
Add(TBuffConvInfo.Create( 57011, UNKNOWN_CHARSET, TBuffConvSingleByte, 'ISCII Punjabi'));
|
|
Add(TBuffConvInfo.Create( 65000, DEFAULT_CHARSET, TBuffConvUTF7, 'Unicode (UTF-7)'));
|
|
Add(TBuffConvInfo.Create( 65001, DEFAULT_CHARSET, TBuffConvUTF8, 'Unicode (UTF-8)'));
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
function TBuffConvInfoList.Find(CodePage: TBuffCodePage): Integer;
|
|
var
|
|
Low, Index: Integer;
|
|
begin
|
|
Result := Count;
|
|
if not Sorted then
|
|
Sort;
|
|
Low := 0;
|
|
while Low < Result do
|
|
begin
|
|
Index := (Low + Result) shr 1;
|
|
if Items[Index].CodePage < CodePage then
|
|
Low := Index + 1
|
|
else
|
|
Result := Index;
|
|
end;
|
|
if Items[Result].CodePage <> CodePage then
|
|
Result := -1;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
function TBuffConvInfoList.GetItem(Index: Integer): TBuffConvInfo;
|
|
begin
|
|
Result := Get(Index);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
procedure TBuffConvInfoList.Notify(Ptr: Pointer; Action: TListNotification);
|
|
begin
|
|
inherited;
|
|
case Action of
|
|
lnAdded: FSorted := False;
|
|
lnDeleted: TBuffConvInfo(Ptr).Free;
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 12.10.2012 --
|
|
procedure TBuffConvInfoList.Sort;
|
|
begin
|
|
inherited Sort(CompareConvInfo);
|
|
FSorted := True;
|
|
end;
|
|
|
|
{ TBuffCodePageName }
|
|
|
|
//-- BG ---------------------------------------------------------- 22.12.2010 --
|
|
constructor TBuffCodePageName.Create(Name: TBuffString; CodePage: TBuffCodePage);
|
|
begin
|
|
inherited Create;
|
|
FName := Name;
|
|
FCodePage := CodePage;
|
|
end;
|
|
|
|
{ TBuffCodePageNameList }
|
|
|
|
//-- BG ---------------------------------------------------------- 22.12.2010 --
|
|
procedure TBuffCodePageNameList.Add(Info: TBuffCodePageName);
|
|
begin
|
|
AddObject(Info.FName, Info);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 22.12.2010 --
|
|
constructor TBuffCodePageNameList.Create;
|
|
// The official CharSet definitions:
|
|
// http://www.iana.org/assignments/character-sets
|
|
// http://www.iana.org/assignments/ianacharset-mib
|
|
begin
|
|
inherited Create;
|
|
BeginUpdate;
|
|
try
|
|
Add(TBuffCodePageName.Create('708', 708)); //708
|
|
Add(TBuffCodePageName.Create('asmo-708', 708)); //708
|
|
|
|
Add(TBuffCodePageName.Create('737', 737)); //737
|
|
Add(TBuffCodePageName.Create('ibm737', 737)); //737
|
|
Add(TBuffCodePageName.Create('cp437', 737)); //737
|
|
Add(TBuffCodePageName.Create('cspc8codepage437', 737)); //737
|
|
|
|
Add(TBuffCodePageName.Create('775', 775)); //775
|
|
Add(TBuffCodePageName.Create('ibm775', 775)); //775
|
|
Add(TBuffCodePageName.Create('cp775', 775)); //775
|
|
Add(TBuffCodePageName.Create('cspc775baltic', 775)); //775
|
|
|
|
Add(TBuffCodePageName.Create('850', 850)); //850
|
|
Add(TBuffCodePageName.Create('ibm850', 850)); //850
|
|
Add(TBuffCodePageName.Create('cp850', 850)); //850
|
|
Add(TBuffCodePageName.Create('cspc850multilingual', 850)); //850
|
|
|
|
Add(TBuffCodePageName.Create('852', 852)); //852
|
|
Add(TBuffCodePageName.Create('ibm852', 852)); //852
|
|
Add(TBuffCodePageName.Create('cp852', 852)); //852
|
|
Add(TBuffCodePageName.Create('cspcp852', 852)); //852
|
|
|
|
Add(TBuffCodePageName.Create('855', 855)); //855
|
|
Add(TBuffCodePageName.Create('ibm855', 855)); //855
|
|
Add(TBuffCodePageName.Create('cp855', 855)); //855
|
|
Add(TBuffCodePageName.Create('csibm855', 855)); //855
|
|
|
|
Add(TBuffCodePageName.Create('857', 857)); //857
|
|
Add(TBuffCodePageName.Create('ibm857', 857)); //857
|
|
Add(TBuffCodePageName.Create('cp857', 857)); //857
|
|
Add(TBuffCodePageName.Create('csibm857', 857)); //857
|
|
|
|
Add(TBuffCodePageName.Create('858', 858)); //858
|
|
Add(TBuffCodePageName.Create('ibm00858', 858)); //858
|
|
Add(TBuffCodePageName.Create('cp858', 858)); //858
|
|
Add(TBuffCodePageName.Create('ccsid00858', 858)); //858
|
|
Add(TBuffCodePageName.Create('cp00858', 858)); //858
|
|
Add(TBuffCodePageName.Create('pc-multilingual-850+euro', 858)); //858
|
|
|
|
Add(TBuffCodePageName.Create('860', 860)); //860
|
|
Add(TBuffCodePageName.Create('ibm860', 860)); //860
|
|
Add(TBuffCodePageName.Create('cp860', 860)); //860
|
|
Add(TBuffCodePageName.Create('csibm860', 860)); //860
|
|
|
|
Add(TBuffCodePageName.Create('861', 861)); //861
|
|
Add(TBuffCodePageName.Create('ibm861', 861)); //861
|
|
Add(TBuffCodePageName.Create('cp861', 861)); //861
|
|
Add(TBuffCodePageName.Create('csibm861', 861)); //861
|
|
Add(TBuffCodePageName.Create('cp-is', 861)); //861
|
|
|
|
Add(TBuffCodePageName.Create('862', 862)); //862
|
|
Add(TBuffCodePageName.Create('ibm862', 862)); //862
|
|
Add(TBuffCodePageName.Create('cp862', 862)); //862
|
|
Add(TBuffCodePageName.Create('cspc862latinhebrew', 862)); //862
|
|
|
|
Add(TBuffCodePageName.Create('863', 863)); //863
|
|
Add(TBuffCodePageName.Create('ibm863', 863)); //863
|
|
Add(TBuffCodePageName.Create('cp863', 863)); //863
|
|
Add(TBuffCodePageName.Create('csibm863', 863)); //863
|
|
|
|
Add(TBuffCodePageName.Create('864', 864)); //864
|
|
Add(TBuffCodePageName.Create('ibm864', 864)); //864
|
|
Add(TBuffCodePageName.Create('cp864', 864)); //864
|
|
Add(TBuffCodePageName.Create('csibm864', 864)); //864
|
|
|
|
Add(TBuffCodePageName.Create('865', 865)); //865
|
|
Add(TBuffCodePageName.Create('ibm865', 865)); //865
|
|
Add(TBuffCodePageName.Create('cp865', 865)); //865
|
|
Add(TBuffCodePageName.Create('csibm865', 865)); //865
|
|
|
|
Add(TBuffCodePageName.Create('866', 866)); //866
|
|
Add(TBuffCodePageName.Create('ibm866', 866)); //866
|
|
Add(TBuffCodePageName.Create('cp866', 866)); //866
|
|
Add(TBuffCodePageName.Create('csibm866', 866)); //866
|
|
|
|
Add(TBuffCodePageName.Create('869', 869)); //869
|
|
Add(TBuffCodePageName.Create('ibm869', 869)); //869
|
|
Add(TBuffCodePageName.Create('cp869', 869)); //869
|
|
Add(TBuffCodePageName.Create('cp-gr', 869)); //869
|
|
Add(TBuffCodePageName.Create('csibm869', 869)); //869
|
|
|
|
Add(TBuffCodePageName.Create('874', 874)); //874
|
|
Add(TBuffCodePageName.Create('windows-874', 874)); //874
|
|
Add(TBuffCodePageName.Create('dos-874', 874)); //874
|
|
Add(TBuffCodePageName.Create('cp874', 874)); //874
|
|
Add(TBuffCodePageName.Create('thai', 874)); //874
|
|
Add(TBuffCodePageName.Create('tis-620', 874)); //874
|
|
Add(TBuffCodePageName.Create('tis620', 874)); //874
|
|
|
|
Add(TBuffCodePageName.Create('922', 922)); //922
|
|
Add(TBuffCodePageName.Create('cp922', 922)); //922
|
|
|
|
Add(TBuffCodePageName.Create('932', 932)); //932
|
|
Add(TBuffCodePageName.Create('ms_kanji', 932)); //932
|
|
Add(TBuffCodePageName.Create('csshiftjis', 932)); //932
|
|
Add(TBuffCodePageName.Create('cswindows31j', 932)); //932
|
|
Add(TBuffCodePageName.Create('shift-jis', 932)); //932
|
|
Add(TBuffCodePageName.Create('shift_jis', 932)); //932
|
|
Add(TBuffCodePageName.Create('shiftjis', 932)); //932
|
|
Add(TBuffCodePageName.Create('x-ms-cp932', 932)); //932
|
|
Add(TBuffCodePageName.Create('ms932', 932)); //932
|
|
Add(TBuffCodePageName.Create('cp932', 932)); //932
|
|
Add(TBuffCodePageName.Create('x-sjis', 932)); //932
|
|
|
|
Add(TBuffCodePageName.Create('936', 936)); //936
|
|
Add(TBuffCodePageName.Create('gbk', 936)); //936
|
|
Add(TBuffCodePageName.Create('cp936', 936)); //936
|
|
Add(TBuffCodePageName.Create('ms936', 936)); //936
|
|
Add(TBuffCodePageName.Create('windows-936', 936)); //936
|
|
Add(TBuffCodePageName.Create('chinese', 936)); //936
|
|
|
|
Add(TBuffCodePageName.Create('943', 943)); //943
|
|
Add(TBuffCodePageName.Create('cp943', 943)); //943
|
|
|
|
Add(TBuffCodePageName.Create('949', 949)); //949
|
|
Add(TBuffCodePageName.Create('cp949', 949)); //949
|
|
Add(TBuffCodePageName.Create('unc', 949)); //949
|
|
Add(TBuffCodePageName.Create('ks_c_5601-1987', 949)); //949
|
|
Add(TBuffCodePageName.Create('iso-ir-149', 949)); //949
|
|
Add(TBuffCodePageName.Create('ks_c_5601-1989', 949)); //949
|
|
Add(TBuffCodePageName.Create('ksc_5601', 949)); //949
|
|
Add(TBuffCodePageName.Create('ksc5601', 949)); //949
|
|
Add(TBuffCodePageName.Create('ks_c_5601', 949)); //949
|
|
Add(TBuffCodePageName.Create('korean', 949)); //949
|
|
Add(TBuffCodePageName.Create('csksc56011987', 949)); //949
|
|
Add(TBuffCodePageName.Create('5601', 949)); //949
|
|
Add(TBuffCodePageName.Create('hangeul', 949)); //949
|
|
|
|
Add(TBuffCodePageName.Create('950', 950)); //950
|
|
Add(TBuffCodePageName.Create('cp950', 950)); //950
|
|
Add(TBuffCodePageName.Create('big5', 950)); //950
|
|
Add(TBuffCodePageName.Create('big-5', 950)); //950
|
|
Add(TBuffCodePageName.Create('csbig5', 950)); //950
|
|
Add(TBuffCodePageName.Create('cn-big5', 950)); //950
|
|
Add(TBuffCodePageName.Create('x-x-big5', 950)); //950
|
|
Add(TBuffCodePageName.Create('ms950', 950)); //950
|
|
Add(TBuffCodePageName.Create('big5-hkscs', 950)); //950
|
|
Add(TBuffCodePageName.Create('big-five', 950)); //950
|
|
Add(TBuffCodePageName.Create('bigfive', 950)); //950
|
|
|
|
Add(TBuffCodePageName.Create('utf-16le', 1200)); //1200
|
|
Add(TBuffCodePageName.Create('utf16le', 1200)); //1200
|
|
Add(TBuffCodePageName.Create('unicode', 1200)); //1200
|
|
Add(TBuffCodePageName.Create('utf-16', 1200)); //1200
|
|
|
|
Add(TBuffCodePageName.Create('utf-16be', 1201)); //1201
|
|
Add(TBuffCodePageName.Create('utf16be', 1201)); //1201
|
|
Add(TBuffCodePageName.Create('unicodefffe', 1201)); //1201
|
|
|
|
Add(TBuffCodePageName.Create('1250', 1250)); //1250
|
|
Add(TBuffCodePageName.Create('x-cp1250', 1250)); //1250
|
|
Add(TBuffCodePageName.Create('cp-1250', 1250)); //1250
|
|
Add(TBuffCodePageName.Create('cp1250', 1250)); //1250
|
|
Add(TBuffCodePageName.Create('ms-ee', 1250)); //1250
|
|
Add(TBuffCodePageName.Create('windows-1250', 1250)); //1250
|
|
Add(TBuffCodePageName.Create('easteurope', 1250)); //1250
|
|
|
|
Add(TBuffCodePageName.Create('1251', 1251)); //1251
|
|
Add(TBuffCodePageName.Create('x-cp1251', 1251)); //1251
|
|
Add(TBuffCodePageName.Create('cp-1251', 1251)); //1251
|
|
Add(TBuffCodePageName.Create('cp1251', 1251)); //1251
|
|
Add(TBuffCodePageName.Create('ms-cyr', 1251)); //1251
|
|
Add(TBuffCodePageName.Create('ms-cyrl', 1251)); //1251
|
|
Add(TBuffCodePageName.Create('win-1251', 1251)); //1251
|
|
Add(TBuffCodePageName.Create('win1251', 1251)); //1251
|
|
Add(TBuffCodePageName.Create('windows-1251', 1251)); //1251
|
|
Add(TBuffCodePageName.Create('russian', 1251)); //1251
|
|
|
|
Add(TBuffCodePageName.Create('1252', 1252)); //1252
|
|
Add(TBuffCodePageName.Create('windows-1252', 1252)); //1252
|
|
Add(TBuffCodePageName.Create('cp1252', 1252)); //1252
|
|
Add(TBuffCodePageName.Create('cp-1252', 1252)); //1252
|
|
Add(TBuffCodePageName.Create('x-ansi', 1252)); //1252
|
|
Add(TBuffCodePageName.Create('ms-ansi', 1252)); //1252
|
|
Add(TBuffCodePageName.Create('ansi', 1252)); //1252
|
|
|
|
Add(TBuffCodePageName.Create('1253', 1253)); //1253
|
|
Add(TBuffCodePageName.Create('windows-1253', 1253)); //1253
|
|
Add(TBuffCodePageName.Create('cp-1253', 1253)); //1253
|
|
Add(TBuffCodePageName.Create('cp1253', 1253)); //1253
|
|
Add(TBuffCodePageName.Create('ms-greek', 1253)); //1253
|
|
|
|
Add(TBuffCodePageName.Create('1254', 1254)); //1254
|
|
Add(TBuffCodePageName.Create('windows-1254', 1254)); //1254
|
|
Add(TBuffCodePageName.Create('cp-1254', 1254)); //1254
|
|
Add(TBuffCodePageName.Create('cp1254', 1254)); //1254
|
|
Add(TBuffCodePageName.Create('ms-turk', 1254)); //1254
|
|
Add(TBuffCodePageName.Create('turkish', 1254)); //1254
|
|
|
|
Add(TBuffCodePageName.Create('1255', 1255)); //1255
|
|
Add(TBuffCodePageName.Create('windows-1255', 1255)); //1255
|
|
Add(TBuffCodePageName.Create('cp-1255', 1255)); //1255
|
|
Add(TBuffCodePageName.Create('cp1255', 1255)); //1255
|
|
Add(TBuffCodePageName.Create('ms-hebr', 1255)); //1255
|
|
|
|
Add(TBuffCodePageName.Create('1256', 1256)); //1256
|
|
Add(TBuffCodePageName.Create('windows-1256', 1256)); //1256
|
|
Add(TBuffCodePageName.Create('cp1256', 1256)); //1256
|
|
Add(TBuffCodePageName.Create('cp-1256', 1256)); //1256
|
|
Add(TBuffCodePageName.Create('ms-arab', 1256)); //1256
|
|
|
|
Add(TBuffCodePageName.Create('1257', 1257)); //1257
|
|
Add(TBuffCodePageName.Create('windows-1257', 1257)); //1257
|
|
Add(TBuffCodePageName.Create('cp-1257', 1257)); //1257
|
|
Add(TBuffCodePageName.Create('cp1257', 1257)); //1257
|
|
Add(TBuffCodePageName.Create('winbaltrim', 1257)); //1257
|
|
|
|
Add(TBuffCodePageName.Create('1258', 1258)); //1258
|
|
Add(TBuffCodePageName.Create('windows-1258', 1258)); //1258
|
|
Add(TBuffCodePageName.Create('cp-1258', 1258)); //1258
|
|
Add(TBuffCodePageName.Create('cp1258', 1258)); //1258
|
|
Add(TBuffCodePageName.Create('vietnamese', 1258)); //1258
|
|
|
|
Add(TBuffCodePageName.Create('johab', 1361)); //1361
|
|
Add(TBuffCodePageName.Create('cp1361', 1361)); //1361
|
|
|
|
Add(TBuffCodePageName.Create('macintosh', 10000)); //10000
|
|
Add(TBuffCodePageName.Create('csmacintosh', 10000)); //10000
|
|
Add(TBuffCodePageName.Create('mac', 10000)); //10000
|
|
Add(TBuffCodePageName.Create('macroman', 10000)); //10000
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-arabic', 10004)); //10004
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-hebrew', 10005)); //10005
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-greek', 10006)); //10006
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-cyrillic', 10007)); //10007
|
|
Add(TBuffCodePageName.Create('maccyrillic', 10007)); //10007
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-romanian', 10010)); //10010
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-ukrainian', 10017)); //10017
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-thai', 10021)); //10021
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-ce', 10029)); //10029
|
|
Add(TBuffCodePageName.Create('cmac', 10029)); //10029
|
|
Add(TBuffCodePageName.Create('macce', 10029)); //10029
|
|
Add(TBuffCodePageName.Create('maccentraleurope', 10029)); //10029
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-icelandic', 10079)); //10079
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-turkish', 10081)); //10081
|
|
|
|
Add(TBuffCodePageName.Create('x-mac-croatian', 10082)); //10082
|
|
|
|
Add(TBuffCodePageName.Create('us-ascii', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('ansi_x3.4-1968', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('iso-ir-6', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('ansi_x3.4-1986', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('iso_646.irv:1991', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('ascii', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('iso646-us', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('us', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('ibm367', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('cp367', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('csascii', 20127)); //20127
|
|
Add(TBuffCodePageName.Create('iso-ir-6us', 20127)); //20127
|
|
|
|
Add(TBuffCodePageName.Create('koi8-r', 20866)); //20866
|
|
Add(TBuffCodePageName.Create('cskoi8r', 20866)); //20866
|
|
Add(TBuffCodePageName.Create('koi', 20866)); //20866
|
|
Add(TBuffCodePageName.Create('koi8', 20866)); //20866
|
|
Add(TBuffCodePageName.Create('koi8r', 20866)); //20866
|
|
|
|
Add(TBuffCodePageName.Create('koi8-u', 21866)); //21866
|
|
Add(TBuffCodePageName.Create('cskoi8u', 21866)); //21866
|
|
Add(TBuffCodePageName.Create('koi8u', 21866)); //21866
|
|
Add(TBuffCodePageName.Create('koi8-ru', 21866)); //21866
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-1', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('cp819', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('ibm819', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('latin1', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('latin-1', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('iso_8859-1:1987', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('iso-ir-100', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('iso_8859-1', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('l1', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('csisolatin1', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('iso8859-1', 28591)); //28591
|
|
Add(TBuffCodePageName.Create('iso 8859-1', 28591)); //28591
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-2', 28592)); //28592
|
|
Add(TBuffCodePageName.Create('iso_8859-2:1987', 28592)); //28592
|
|
Add(TBuffCodePageName.Create('iso-ir-101', 28592)); //28592
|
|
Add(TBuffCodePageName.Create('iso_8859-2', 28592)); //28592
|
|
Add(TBuffCodePageName.Create('latin2', 28592)); //28592
|
|
Add(TBuffCodePageName.Create('latin-2', 28592)); //28592
|
|
Add(TBuffCodePageName.Create('l2', 28592)); //28592
|
|
Add(TBuffCodePageName.Create('csisolatin2', 28592)); //28592
|
|
Add(TBuffCodePageName.Create('iso8859-2', 28592)); //28592
|
|
Add(TBuffCodePageName.Create('iso 8859-2', 28592)); //28592
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-3', 28593)); //28593
|
|
Add(TBuffCodePageName.Create('iso_8859-3:1988', 28593)); //28593
|
|
Add(TBuffCodePageName.Create('iso-ir-109', 28593)); //28593
|
|
Add(TBuffCodePageName.Create('iso_8859-3', 28593)); //28593
|
|
Add(TBuffCodePageName.Create('latin3', 28593)); //28593
|
|
Add(TBuffCodePageName.Create('latin-3', 28593)); //28593
|
|
Add(TBuffCodePageName.Create('l3', 28593)); //28593
|
|
Add(TBuffCodePageName.Create('csisolatin3', 28593)); //28593
|
|
Add(TBuffCodePageName.Create('iso 8859-3', 28593)); //28593
|
|
Add(TBuffCodePageName.Create('iso8859-3', 28593)); //28593
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-4', 28594)); //28594
|
|
Add(TBuffCodePageName.Create('iso_8859-4:1988', 28594)); //28594
|
|
Add(TBuffCodePageName.Create('iso-ir-110', 28594)); //28594
|
|
Add(TBuffCodePageName.Create('iso_8859-4', 28594)); //28594
|
|
Add(TBuffCodePageName.Create('latin4', 28594)); //28594
|
|
Add(TBuffCodePageName.Create('latin-4', 28594)); //28594
|
|
Add(TBuffCodePageName.Create('l4', 28594)); //28594
|
|
Add(TBuffCodePageName.Create('csisolatin4', 28594)); //28594
|
|
Add(TBuffCodePageName.Create('iso 8859-4', 28594)); //28594
|
|
Add(TBuffCodePageName.Create('iso8859-4', 28594)); //28594
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-5', 28595)); //28595
|
|
Add(TBuffCodePageName.Create('iso_8859-5:1988', 28595)); //28595
|
|
Add(TBuffCodePageName.Create('iso-ir-144', 28595)); //28595
|
|
Add(TBuffCodePageName.Create('iso_8859-5', 28595)); //28595
|
|
Add(TBuffCodePageName.Create('cyrillic', 28595)); //28595
|
|
Add(TBuffCodePageName.Create('csisolatincyrillic', 28595)); //28595
|
|
Add(TBuffCodePageName.Create('l5', 28595)); //28595
|
|
Add(TBuffCodePageName.Create('iso 8859-5', 28595)); //28595
|
|
Add(TBuffCodePageName.Create('iso8859-5', 28595)); //28595
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-6', 28596)); //28596
|
|
Add(TBuffCodePageName.Create('iso_8859-6:1987', 28596)); //28596
|
|
Add(TBuffCodePageName.Create('arabic', 28596)); //28596
|
|
Add(TBuffCodePageName.Create('csisolatinarabic', 28596)); //28596
|
|
Add(TBuffCodePageName.Create('ecma-114', 28596)); //28596
|
|
Add(TBuffCodePageName.Create('iso_8859-6', 28596)); //28596
|
|
Add(TBuffCodePageName.Create('iso-ir-127', 28596)); //28596
|
|
Add(TBuffCodePageName.Create('iso 8859-6', 28596)); //28596
|
|
Add(TBuffCodePageName.Create('iso8859-6', 28596)); //28596
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-7', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('iso_8859-7:1987', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('iso-ir-126', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('iso_8859-7', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('elot_928', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('ecma-118', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('greek', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('greek8', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('csisolatingreek', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('iso 8859-7', 28597)); //28597
|
|
Add(TBuffCodePageName.Create('iso8859-7', 28597)); //28597
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-8', 28598)); //28598
|
|
Add(TBuffCodePageName.Create('iso_8859-8:1988', 28598)); //28598
|
|
Add(TBuffCodePageName.Create('iso-ir-138', 28598)); //28598
|
|
Add(TBuffCodePageName.Create('iso_8859-8', 28598)); //28598
|
|
Add(TBuffCodePageName.Create('hebrew', 28598)); //28598
|
|
Add(TBuffCodePageName.Create('csisolatinhebrew', 28598)); //28598
|
|
Add(TBuffCodePageName.Create('visual', 28598)); //28598
|
|
Add(TBuffCodePageName.Create('iso 8859-8', 28598)); //28598
|
|
Add(TBuffCodePageName.Create('iso8859-8', 28598)); //28598
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-9', 28599)); //28599
|
|
Add(TBuffCodePageName.Create('iso_8859-9:1989', 28599)); //28599
|
|
Add(TBuffCodePageName.Create('iso-ir-148', 28599)); //28599
|
|
Add(TBuffCodePageName.Create('iso_8859-9', 28599)); //28599
|
|
Add(TBuffCodePageName.Create('latin5', 28599)); //28599
|
|
Add(TBuffCodePageName.Create('latin-5', 28599)); //28599
|
|
Add(TBuffCodePageName.Create('l5', 28599)); //28599
|
|
Add(TBuffCodePageName.Create('csisolatin5', 28599)); //28599
|
|
Add(TBuffCodePageName.Create('iso 8859-9', 28599)); //28599
|
|
Add(TBuffCodePageName.Create('iso8859-9', 28599)); //28599
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-10', 28600)); //28600
|
|
Add(TBuffCodePageName.Create('iso-ir-157', 28600)); //28600
|
|
Add(TBuffCodePageName.Create('l6', 28600)); //28600
|
|
Add(TBuffCodePageName.Create('iso_8859-10:1992', 28600)); //28600
|
|
Add(TBuffCodePageName.Create('csisolatin6', 28600)); //28600
|
|
Add(TBuffCodePageName.Create('iso 8859-10', 28600)); //28600
|
|
Add(TBuffCodePageName.Create('iso8859-10', 28600)); //28600
|
|
Add(TBuffCodePageName.Create('iso_8859-10', 28600)); //28600
|
|
Add(TBuffCodePageName.Create('latin6', 28600)); //28600
|
|
Add(TBuffCodePageName.Create('latin-6', 28600)); //28600
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-11', 28601)); //28601
|
|
Add(TBuffCodePageName.Create('iso 8859-11', 28601)); //28601
|
|
Add(TBuffCodePageName.Create('iso8859-11', 28601)); //28601
|
|
Add(TBuffCodePageName.Create('iso_8859-11', 28601)); //28601
|
|
Add(TBuffCodePageName.Create('iso_8859-11:1992', 28601)); //28601
|
|
Add(TBuffCodePageName.Create('tactis', 28601)); //28601
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-13', 28603)); //28603
|
|
Add(TBuffCodePageName.Create('iso 8859-13', 28603)); //28603
|
|
Add(TBuffCodePageName.Create('iso-ir-179', 28603)); //28603
|
|
Add(TBuffCodePageName.Create('iso8859-13', 28603)); //28603
|
|
Add(TBuffCodePageName.Create('iso_8859-13', 28603)); //28603
|
|
Add(TBuffCodePageName.Create('l7', 28603)); //28603
|
|
Add(TBuffCodePageName.Create('latin7', 28603)); //28603
|
|
Add(TBuffCodePageName.Create('latin-7', 28603)); //28603
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-14', 28604)); //28604
|
|
Add(TBuffCodePageName.Create('iso 8859-14', 28604)); //28604
|
|
Add(TBuffCodePageName.Create('iso-ir-199', 28604)); //28604
|
|
Add(TBuffCodePageName.Create('iso8859-14', 28604)); //28604
|
|
Add(TBuffCodePageName.Create('iso_8859-14', 28604)); //28604
|
|
Add(TBuffCodePageName.Create('iso_8859-14:1998', 28604)); //28604
|
|
Add(TBuffCodePageName.Create('l8', 28604)); //28604
|
|
Add(TBuffCodePageName.Create('latin8', 28604)); //28604
|
|
Add(TBuffCodePageName.Create('latin-8', 28604)); //28604
|
|
Add(TBuffCodePageName.Create('iso-celtic', 28604)); //28604
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-15', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('iso_8859-15', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('latin-9', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('latin9', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('l9', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('iso 8859-15', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('iso-ir-203', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('iso8859-15', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('iso_8859-15:1998', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('latin-0', 28605)); //28605
|
|
Add(TBuffCodePageName.Create('latin0', 28605)); //28605
|
|
|
|
Add(TBuffCodePageName.Create('iso-8859-16', 28606)); //28606
|
|
Add(TBuffCodePageName.Create('iso 8859-16', 28606)); //28606
|
|
Add(TBuffCodePageName.Create('iso-ir-226', 28606)); //28606
|
|
Add(TBuffCodePageName.Create('iso8859-16', 28606)); //28606
|
|
Add(TBuffCodePageName.Create('iso_8859-16', 28606)); //28606
|
|
Add(TBuffCodePageName.Create('iso_8859-16:2000', 28606)); //28606
|
|
Add(TBuffCodePageName.Create('latin10', 28606)); //28606
|
|
|
|
Add(TBuffCodePageName.Create('iso-2022-jp', 50220)); //50220
|
|
Add(TBuffCodePageName.Create('iso 2022-jp', 50220)); //50220
|
|
Add(TBuffCodePageName.Create('csiso2022jp', 50220)); //50220
|
|
|
|
Add(TBuffCodePageName.Create('iso-2022-jp-1', 50222)); //50222
|
|
Add(TBuffCodePageName.Create('_iso-2022-jp$sio', 50222)); //50222
|
|
|
|
Add(TBuffCodePageName.Create('iso-2022-kr', 50225)); //50225
|
|
Add(TBuffCodePageName.Create('csiso2022kr', 50225)); //50225
|
|
|
|
Add(TBuffCodePageName.Create('iso-2022-cn', 50227)); //50227
|
|
Add(TBuffCodePageName.Create('csiso2022cn', 50227)); //50227
|
|
Add(TBuffCodePageName.Create('x-cp50227', 50227)); //50227
|
|
|
|
Add(TBuffCodePageName.Create('euc-jp', 51932)); //51932
|
|
Add(TBuffCodePageName.Create('eucjp', 51932)); //51932
|
|
Add(TBuffCodePageName.Create('cseucjp', 51932)); //51932
|
|
Add(TBuffCodePageName.Create('euc_jp', 51932)); //51932
|
|
Add(TBuffCodePageName.Create('cseucpkdfmtjapanese', 51932)); //51932
|
|
Add(TBuffCodePageName.Create('x-euc', 51932)); //51932
|
|
Add(TBuffCodePageName.Create('x-euc-jp', 51932)); //51932
|
|
|
|
Add(TBuffCodePageName.Create('cn-gb', 51936)); //51936
|
|
Add(TBuffCodePageName.Create('euc-cn', 51936)); //51936
|
|
Add(TBuffCodePageName.Create('euc_cn', 51936)); //51936
|
|
Add(TBuffCodePageName.Create('euccn', 51936)); //51936
|
|
Add(TBuffCodePageName.Create('csgb2312', 51936)); //51936
|
|
Add(TBuffCodePageName.Create('gb2312', 51936)); //51936
|
|
Add(TBuffCodePageName.Create('gb_2312-80', 51936)); //51936
|
|
Add(TBuffCodePageName.Create('x-cp20936', 51936)); //51936
|
|
Add(TBuffCodePageName.Create('csiso58gb231280', 51936)); //51936
|
|
Add(TBuffCodePageName.Create('iso-ir-58', 51936)); //51936
|
|
|
|
Add(TBuffCodePageName.Create('euc-kr', 51949)); //51949
|
|
Add(TBuffCodePageName.Create('euc_kr', 51949)); //51949
|
|
Add(TBuffCodePageName.Create('cseuckr', 51949)); //51949
|
|
Add(TBuffCodePageName.Create('euckr', 51949)); //51949
|
|
|
|
Add(TBuffCodePageName.Create('gb18030', 54936)); //54936
|
|
Add(TBuffCodePageName.Create('gb-18030', 54936)); //54936
|
|
|
|
Add(TBuffCodePageName.Create('utf-7', 65000)); //65000
|
|
Add(TBuffCodePageName.Create('csunicode11utf7', 65000)); //65000
|
|
Add(TBuffCodePageName.Create('unicode-1-1-utf-7', 65000)); //65000
|
|
Add(TBuffCodePageName.Create('x-unicode-2-0-utf-7', 65000)); //65000
|
|
|
|
Add(TBuffCodePageName.Create('utf-8', 65001)); //65001
|
|
Add(TBuffCodePageName.Create('utf8', 65001)); //65001
|
|
Add(TBuffCodePageName.Create('unicode-1-1-utf-8', 65001)); //65001
|
|
Add(TBuffCodePageName.Create('unicode-2-0-utf-8', 65001)); //65001
|
|
Add(TBuffCodePageName.Create('x-unicode-2-0-utf-8', 65001)); //65001
|
|
|
|
// Add(TBuffCodePageName.Create('koi8-t', CP_UNKNOWN)); //-5
|
|
|
|
Add(TBuffCodePageName.Create('default', CP_ACP));
|
|
// BG, 11.10.2012: too many compiler versions do not declare CP_SYMBOL. Do we actually need it?
|
|
// Add(TBuffCodePageName.Create('symbol', CP_SYMBOL));
|
|
Add(TBuffCodePageName.Create('oem', CP_OEMCP));
|
|
|
|
CaseSensitive := False;
|
|
Sort;
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 08.01.2011 --
|
|
destructor TBuffCodePageNameList.Destroy;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
//BG, 08.01.2011: Issue 48: Memory leaks in HTMLBuffer.pas
|
|
// free the objects. Unlike Guilleaumes idea to set TStringList.OwnsObjects to True, we
|
|
// must free the objects on our own, as OwnsObjects is a property added in Delphi 2009.
|
|
BeginUpdate;
|
|
try
|
|
for I := Count - 1 downto 0 do
|
|
Objects[I].Free;
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 22.12.2010 --
|
|
function TBuffCodePageNameList.GetItem(Index: Integer): TBuffCodePageName;
|
|
begin
|
|
Result := TBuffCodePageName(Objects[Index]);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 22.12.2010 --
|
|
function TBuffCodePageNameList.IndexOf(const S: TBuffString): Integer;
|
|
var
|
|
LS: TBuffString;
|
|
begin
|
|
Result := inherited IndexOf(S);
|
|
if Result = -1 then
|
|
begin
|
|
LS := htLowerCase(S);
|
|
Result := Count - 1;
|
|
while (Result >= 0) and (Pos(Strings[Result], LS) = 0) do
|
|
Dec(Result);
|
|
end;
|
|
end;
|
|
|
|
{ TBuffConverter }
|
|
|
|
//-- BG ---------------------------------------------------------- 02.10.2012 --
|
|
procedure TBuffConverter.Assign(Source: TBuffConverter);
|
|
begin
|
|
FPos := Source.FPos;
|
|
FEnd := Source.FEnd;
|
|
FCodePage := Source.FCodePage;
|
|
FInitalCodePage := Source.FInitalCodePage;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 02.10.2012 --
|
|
function TBuffConverter.AsString: TBuffString;
|
|
var
|
|
Bytes, Chars: Integer;
|
|
OldPos: PByte;
|
|
begin
|
|
Bytes := FEnd.AnsiChr - FPos.AnsiChr;
|
|
if (FCodePage = CP_UTF16LE) and (FInitalCodePage = CP_UTF16LE) then
|
|
begin
|
|
SetLength(Result, Bytes div 2);
|
|
System.Move(FPos.BytePtr^, Result[1], Bytes);
|
|
end
|
|
else
|
|
begin
|
|
Chars := 0;
|
|
if Bytes > 0 then
|
|
begin
|
|
SetLength(Result, Bytes);
|
|
OldPos := FPos.BytePtr;
|
|
try
|
|
repeat
|
|
Inc(Chars);
|
|
Result[Chars] := NextChar;
|
|
if Result[Chars] = #0 then
|
|
begin
|
|
Dec(Chars);
|
|
break;
|
|
end;
|
|
until FPos.AnsiChr >= FEnd.AnsiChr;
|
|
finally
|
|
FPos.BytePtr := OldPos;
|
|
end;
|
|
end;
|
|
SetLength(Result, Chars);
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 26.09.2012 --
|
|
constructor TBuffConverter.Create(CurrPtr, EndPtr: TBuffPointer; CodePage, InitalCodePage: TBuffCodePage);
|
|
begin
|
|
inherited Create;
|
|
FPos := CurrPtr;
|
|
FEnd := EndPtr;
|
|
FCodePage := CodePage;
|
|
FInitalCodePage := InitalCodePage;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 26.09.2012 --
|
|
constructor TBuffConverter.CreateCopy(Source: TBuffConverter);
|
|
begin
|
|
inherited Create;
|
|
Assign(Source);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 26.09.2012 --
|
|
function TBuffConverter.GetNext: Word;
|
|
|
|
procedure SwapBytes(var Chr: Word);
|
|
var
|
|
Bytes: array[0..1] of Byte absolute Chr;
|
|
B: Byte;
|
|
begin
|
|
B := Bytes[0];
|
|
Bytes[0]:= Bytes[1];
|
|
Bytes[1] := B;
|
|
end;
|
|
|
|
begin
|
|
// Issue 50: THTMLViewer.LoadStrings does not seem to work
|
|
// Creating the buffer from wide-/unicodestring may contain incorrectly
|
|
// converted characters of a single byte codepage though. After changing the
|
|
// codepage to the correct single byte codepage, the first or second character
|
|
// read is a #0 (namely the high byte of the previous WideChar).
|
|
//
|
|
// And #0 represents the end of the buffer.
|
|
//
|
|
// Thus always use the initial codepage for reading the appropriate number
|
|
// of bytes of a character in the correct byte order from buffer.
|
|
if FPos.AnsiChr < FEnd.AnsiChr then
|
|
case FInitalCodePage of
|
|
CP_UTF16LE:
|
|
begin
|
|
Result := FPos.WordPtr^;
|
|
Inc(FPos.BytePtr, sizeof(Word));
|
|
end;
|
|
|
|
CP_UTF16BE:
|
|
begin
|
|
Result := FPos.WordPtr^;
|
|
Inc(FPos.BytePtr, sizeof(Word));
|
|
SwapBytes(Result);
|
|
end;
|
|
else
|
|
Result := FPos.BytePtr^;
|
|
Inc(FPos.BytePtr, sizeof(Byte));
|
|
end
|
|
else
|
|
Result := 0;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 26.09.2012 --
|
|
function TBuffConverter.NextChar: TBuffChar;
|
|
begin
|
|
Result := TBuffChar(GetNext);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 26.09.2012 --
|
|
function TBuffConverter.PeekChar: TBuffChar;
|
|
var
|
|
Clone: TBuffConverter;
|
|
TheClass: TClass;
|
|
begin
|
|
TheClass := ClassType;
|
|
Clone := TBuffConverterClass(TheClass).CreateCopy(Self);
|
|
try
|
|
Result := Clone.NextChar;
|
|
finally
|
|
Clone.Free;
|
|
end;
|
|
end;
|
|
|
|
{ TBuffer }
|
|
|
|
procedure TBuffer.Assign(Source: TBuffer);
|
|
begin
|
|
FBuffer := Copy(Source.FBuffer);
|
|
Reset;
|
|
Inc(FStart.AnsiChr, Source.FStart.AnsiChr - PAnsiChar(Source.FBuffer));
|
|
FName := Source.FName;
|
|
FConverter := TBuffConverterClass(Source.FConverter.ClassType).Create(FStart, FEnd, Source.FConverter.FCodePage, Source.FConverter.FInitalCodePage);
|
|
FState := Source.FState;
|
|
FBomLength := Source.FBomLength;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 27.12.2010 --
|
|
procedure TBuffer.AssignTo(Destin: TObject);
|
|
var
|
|
DstMem: TMemoryStream absolute Destin;
|
|
begin
|
|
if DstMem is TMemoryStream then
|
|
begin
|
|
DstMem.SetSize(Size);
|
|
System.Move(FBuffer[0], DstMem.Memory^, Size);
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 26.09.2012 --
|
|
function TBuffer.AsString: TBuffString;
|
|
begin
|
|
Result := FConverter.AsString;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 14.12.2010 --
|
|
constructor TBuffer.Create(Stream: TStream; Name: TBuffString = '');
|
|
begin
|
|
inherited Create;
|
|
SetStream(Stream);
|
|
FName := Name;
|
|
DetectCodePage;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 14.12.2010 --
|
|
constructor TBuffer.Create(Stream: TStream; CodePage: TBuffCodePage; Name: TBuffString = '');
|
|
begin
|
|
inherited Create;
|
|
SetStream(Stream);
|
|
FName := Name;
|
|
SetCodePage(CodePage);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 17.12.2010 --
|
|
constructor TBuffer.Create(const Text: TBuffString; const Name: TBuffString = ''; CodePage: TBuffCodePage = CP_UTF16LE);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited Create;
|
|
I := Length(Text) * sizeof(TBuffChar);
|
|
SetLength(FBuffer, I + sizeof(TBuffChar));
|
|
if I > 0 then
|
|
Move(Text[1], FBuffer[0], I);
|
|
PBuffChar(@FBuffer[I])^ := TBuffChar(0);
|
|
Reset;
|
|
FName := Name;
|
|
SetCodePages(CodePage, CP_UTF16LE);
|
|
Include(FState, bsFixedCodePage);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 29.10.2012 --
|
|
constructor TBuffer.Create(const Doc: TBuffer);
|
|
begin
|
|
inherited Create;
|
|
Assign(Doc);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 17.12.2010 --
|
|
constructor TBuffer.Create(const Text: TBuffString; CodePage: TBuffCodePage; const Name: TBuffString = '');
|
|
begin
|
|
Create(Text, Name, CodePage);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 17.12.2010 --
|
|
constructor TBuffer.Create(Text: PByte; ByteCount: Integer; CodePage: TBuffCodePage; const Name: TBuffString = '');
|
|
begin
|
|
Create(Text, ByteCount, CodePage, CodePage, Name);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 17.12.2010 --
|
|
constructor TBuffer.Create(Text: PByte; ByteCount: Integer; CodePage, InitialCodePage: TBuffCodePage; const Name: TBuffString = '');
|
|
var
|
|
I: Integer;
|
|
begin
|
|
inherited Create;
|
|
I := ByteCount;
|
|
SetLength(FBuffer, I + sizeof(TBuffChar));
|
|
Move(Text^, FBuffer[0], I);
|
|
PBuffChar(@FBuffer[I])^ := TBuffChar(0);
|
|
Reset;
|
|
FName := Name;
|
|
SetCodePages(CodePage, InitialCodePage);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 06.12.2011 --
|
|
class function TBuffer.Convert(const Text: TBuffString; CodePage: TBuffCodePage): TBuffString;
|
|
var
|
|
Buffer: TBuffer;
|
|
begin
|
|
Buffer := TBuffer.Create(Text, CodePage);
|
|
try
|
|
Result := Buffer.AsString;
|
|
finally
|
|
Buffer.Free;
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 06.12.2011 --
|
|
class function TBuffer.Convert(Text: PByte; ByteCount: Integer; CodePage: TBuffCodePage): TBuffString;
|
|
var
|
|
Buffer: TBuffer;
|
|
begin
|
|
Buffer := TBuffer.Create(Text, ByteCount, CodePage);
|
|
try
|
|
Result := Buffer.AsString;
|
|
finally
|
|
Buffer.Free;
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 06.12.2011 --
|
|
class function TBuffer.Convert(Text: PByte; ByteCount: Integer; CodePage, InitialCodePage: TBuffCodePage): TBuffString;
|
|
var
|
|
Buffer: TBuffer;
|
|
begin
|
|
Buffer := TBuffer.Create(Text, ByteCount, CodePage, InitialCodePage);
|
|
try
|
|
Result := Buffer.AsString;
|
|
finally
|
|
Buffer.Free;
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 14.12.2010 --
|
|
destructor TBuffer.Destroy;
|
|
begin
|
|
FConverter.Free;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TBuffer.DetectCodePage;
|
|
var
|
|
ByteCount: Integer;
|
|
|
|
function IsIso2022JP: boolean;
|
|
{look for iso-2022-jp Japanese file}
|
|
const
|
|
EscSequence: array [0..3] of PAnsiChar = (#$1b'$@'#0, #$1b'$B'#0, #$1b'(J'#0, #$1b'(B'#0);
|
|
var
|
|
I, J, K, L: PAnsiChar;
|
|
begin
|
|
Result := False;
|
|
I := StrNPosA(FStart.AnsiChr, EscSequence[0], ByteCount); {look for starting sequence}
|
|
J := StrNPosA(FStart.AnsiChr, EscSequence[1], ByteCount);
|
|
if I < J then
|
|
I := J;
|
|
if I <> nil then
|
|
begin {now look for ending sequence after the start}
|
|
K := StrNPosA(I, EscSequence[2], ByteCount);
|
|
L := StrNPosA(I, EscSequence[3], ByteCount);
|
|
if K < L then
|
|
K := L; {pick a positive value}
|
|
if K <> nil then {start and end sequence found}
|
|
Result := True;
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
FreeAndNil(FConverter);
|
|
ByteCount := FEnd.AnsiChr - FStart.AnsiChr;
|
|
if ByteCount >= 2 then
|
|
begin
|
|
// a preamble of up to 3 bytes might tell us the file encoding:
|
|
case FStart.WordPtr^ of
|
|
$FEFF:
|
|
begin
|
|
// this is little endian unicode
|
|
Inc(FStart.WordPtr);
|
|
CodePage := CP_UTF16LE;
|
|
Include(FState, bsFixedCodePage);
|
|
// TODO: if followed by $0000, this is UTF-32-LE
|
|
FBomLength := 2;
|
|
Exit;
|
|
end;
|
|
|
|
$FFFE:
|
|
begin
|
|
// this is big endian unicode
|
|
// swap the 2 bytes of one char.
|
|
Inc(FStart.WordPtr);
|
|
CodePage := CP_UTF16BE;
|
|
Include(FState, bsFixedCodePage);
|
|
// TODO: if followed by $0000, this is UTF-32-3412
|
|
FBomLength := 2;
|
|
Exit;
|
|
end;
|
|
|
|
$BBEF:
|
|
if ByteCount >= 3 then
|
|
begin
|
|
Inc(FStart.WordPtr);
|
|
if FStart.BytePtr^ = $BF then
|
|
begin
|
|
// this is UTF-8
|
|
Inc(FStart.BytePtr);
|
|
CodePage := CP_UTF8;
|
|
Include(FState, bsFixedCodePage);
|
|
FBomLength := 3;
|
|
Exit;
|
|
end;
|
|
Dec(FStart.WordPtr);
|
|
end;
|
|
|
|
//TODO:
|
|
{
|
|
$0000:
|
|
if followed by $FFFE, this is UTF-32-BE
|
|
if followed by $FEFF, this is UTF-32-2143
|
|
}
|
|
end;
|
|
|
|
if (FStart.WordPtr^ and $00FF) = 0 then
|
|
begin
|
|
if (FStart.WordPtr^ and $FF00) <> 0 then
|
|
begin
|
|
CodePage := CP_UTF16BE;
|
|
Include(FState, bsFixedCodePage);
|
|
Exit;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
if (FStart.WordPtr^ and $FF00) = 0 then
|
|
begin
|
|
CodePage := CP_UTF16LE;
|
|
Include(FState, bsFixedCodePage);
|
|
Exit;
|
|
end;
|
|
end;
|
|
end;
|
|
if IsIso2022JP then
|
|
begin
|
|
CodePage := CP_ISO2022JP;
|
|
Include(FState, bsFixedCodePage);
|
|
Exit;
|
|
end;
|
|
// no preamble: this is most probably a 1-byte per character code.
|
|
{$ifdef LCL}
|
|
if htExpectsUTF8 then
|
|
CodePage := CP_UTF8
|
|
else
|
|
{$endif}
|
|
CodePage := CP_ACP;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 26.09.2012 --
|
|
function TBuffer.GetCodePage: TBuffCodePage;
|
|
begin
|
|
if FConverter <> nil then
|
|
Result := FConverter.CodePage
|
|
else
|
|
Result := CP_UNKNOWN;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 16.12.2010 --
|
|
function TBuffer.GetPosition: Integer;
|
|
begin
|
|
Result := FConverter.FPos.AnsiChr - PAnsiChar(FBuffer);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 31.01.2011 --
|
|
function TBuffer.GetString(FromIndex, UntilIndex: Integer): TBuffString;
|
|
var
|
|
OldPos, I: Integer;
|
|
begin
|
|
SetLength(Result, UntilIndex - FromIndex);
|
|
if Length(Result) > 0 then
|
|
begin
|
|
OldPos := Position;
|
|
try
|
|
I := 0;
|
|
Position := FromIndex;
|
|
while Position < UntilIndex do
|
|
begin
|
|
Inc(I);
|
|
Result[I] := NextChar;
|
|
end;
|
|
SetLength(Result, I);
|
|
finally
|
|
Position := OldPos;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 26.09.2012 --
|
|
function TBuffer.NextChar: TBuffChar;
|
|
begin
|
|
Result := FConverter.NextChar;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 26.09.2012 --
|
|
function TBuffer.PeekChar: TBuffChar;
|
|
begin
|
|
Result := FConverter.PeekChar;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 16.12.2010 --
|
|
procedure TBuffer.Reset;
|
|
begin
|
|
FStart.AnsiChr := PAnsiChar(FBuffer);
|
|
FEnd.AnsiChr := FStart.AnsiChr + Size;
|
|
end;
|
|
|
|
//-- BG --------------------------------------------------------- 11.11.2011 --
|
|
procedure TBuffer.SetCodePage(Value: TBuffCodePage);
|
|
begin
|
|
if bsFixedCodePage in FState then
|
|
exit;
|
|
|
|
if FConverter = nil then
|
|
SetCodePages(Value, Value)
|
|
else
|
|
SetCodePages(Value, FConverter.FInitalCodePage);
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 13.10.2012 --
|
|
procedure TBuffer.SetCodePages(Value, Initial: TBuffCodePage);
|
|
var
|
|
Index: Integer;
|
|
OldConverter: TBuffConverter;
|
|
CodePageInfos: TBuffConvInfoList;
|
|
begin
|
|
CodePageInfos := GetConvInfoList;
|
|
if CodePageInfos <> nil then
|
|
begin
|
|
if FConverter = nil then
|
|
begin
|
|
// setting CodePage for the first time:
|
|
Index := CodePageInfos.Find(Value);
|
|
if Index < 0 then
|
|
Index := CodePageInfos.Find(CP_UNKNOWN);
|
|
FConverter := CodePageInfos[Index].Converter.Create(FStart, FEnd, Value, Initial)
|
|
end
|
|
else
|
|
begin
|
|
// setting CodePage again:
|
|
if FConverter.CodePage = Value then
|
|
// same CodePage again. Nothing to do.
|
|
exit;
|
|
|
|
// Change the CodePage. Keep common internal states including InitialCodePage.
|
|
OldConverter := FConverter;
|
|
OldConverter.FCodePage := Value; // set new code page to old converter. CreateCopy will set it to the new converter.
|
|
OldConverter.FInitalCodePage := Initial;
|
|
Index := CodePageInfos.Find(Value);
|
|
if Index < 0 then
|
|
Index := CodePageInfos.Find(CP_UNKNOWN);
|
|
FConverter := CodePageInfos[Index].Converter.CreateCopy(OldConverter);
|
|
OldConverter.Free;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 16.12.2010 --
|
|
procedure TBuffer.SetPosition(const Value: Integer);
|
|
begin
|
|
FConverter.FPos.AnsiChr := PAnsiChar(FBuffer) + Value;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 16.12.2010 --
|
|
procedure TBuffer.SetStream(Stream: TStream);
|
|
var
|
|
I: Integer;
|
|
begin
|
|
I := Stream.Size - Stream.Position;
|
|
SetLength(FBuffer, I + sizeof(TBuffChar));
|
|
//BG, 25.02.2011: Issue 74: Range check error when creating a buffer for the empty stream
|
|
// Do not read from empty/exhausted stream:
|
|
if I > 0 then
|
|
Stream.Read(FBuffer[0], I);
|
|
PBuffChar(@FBuffer[I])^ := TBuffChar(0);
|
|
Reset;
|
|
end;
|
|
|
|
//-- BG ---------------------------------------------------------- 16.12.2010 --
|
|
function TBuffer.Size: Integer;
|
|
begin
|
|
Result := Length(FBuffer) - sizeof(TBuffChar);
|
|
end;
|
|
|
|
initialization
|
|
finalization
|
|
// GDG
|
|
VFinalizing := True;
|
|
FreeAndNil(VCodePagesByName);
|
|
FreeAndNil(VConvertersByCodePage);
|
|
end.
|
|
|
|
|