>> The D2009 TInitFile already uses the WritePrivateProfileStringW and
>> GetPrivateProfileStringW versions of the functions, but only work if
>> the ini file already exists and is Unicode.
>>
>
> Surprise! That works indeed with UTF-16, however if there is a UTF-8
> BOM and data I cannot read a string, have you tested with UTF-8 as well?
>
I tested right now and unfortunately don't work, but we can easily
extend the class to support UTF8 BOM marked files.
interface
uses Inifiles;
type
TMyUnicodeIniFile = class(TIniFile)
private
fIsUTF8: Boolean;
public
function ReadString(const Section, Ident, Default: string): string;
override;
procedure WriteString(const Section, Ident, Value: string); override;
constructor Create(const aFileName: string);
end;
implementation
uses Windows, Classes, sysutils, RTLConsts;
constructor TMyUnicodeIniFile.Create(const aFileName: string);
var f: TfileStream;
i: integer;
const UnicodeBOM: word = $FEFF;
UTF8BOM: Integer = $00BFBBEF;
begin
if not fileexists(aFileName) then
begin
f := Tfilestream.Create(aFilename, fmCreate);
try
f.Write(UnicodeBOM, 2);
finally
f.Free;
end
end else
begin
f := Tfilestream.Create(aFilename, fmOpenRead);
try
i := 0;
f.read(i, sizeof(i));
fIsUTF8 := i and $00FFFFFF = UTF8BOM;
finally
f.Free;
end;
end;
inherited;
end;
function TMyUnicodeIniFile.ReadString(const Section, Ident, Default:
string): string;
begin
result := inherited;
if fIsUTF8 then
result := utf8decode(result)
end;
procedure TMyUnicodeIniFile.WriteString(const Section, Ident, Value:
string);
var s: Ansistring;
begin
if fIsUTF8 then
begin
s := Utf8Encode(Value);
if not WritePrivateProfileStringA(PAnsiChar(AnsiString((Section))),
PAnsiChar(AnsiString((Ident))),
PAnsiChar(s), PAnsiChar(AnsiString((FileName)))) then
raise EIniFileException.CreateResFmt(@SIniFileWriteError, [FileName]);
end else
inherited;
end;
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://lists.elists.org/cgi-bin/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be