Notes |
|
(0016649)
|
vdemidov
|
30-10-2015 08:53
(edited on: 30-10-2015 08:56) |
|
Даже не знаю что делать. Городить свой огород, или воспользоваться набором совместимости от GunSmoker описанному в статье и сделать вид, что в старой делфи есть все, что и в новой.
|
|
|
(0016650)
|
zed
|
30-10-2015 09:05
|
|
А идею с флагом, который указывает на кодировку, уже похоронил? Мне она кажется самым надёжным вариантом - ведь BOM он такой, может быть, а может и нет. Особенно при ручном редактировании. |
|
|
|
Я всегда говорил, что считаю bom вполне достаточным. А флаг то для изменяемых ini, про него речь пока не идет. |
|
|
(0016678)
|
zed
|
01-11-2015 11:13
|
|
В mORMot.SynCommons.pas есть функция для чтения текстовых файлов с детектированием кодировки:
/// get text File contents (even Unicode or UTF8) and convert it into a
// Charset-compatible AnsiString (for Delphi 7) or an UnicodeString (for Delphi
// 2009 and up) according to any BOM marker at the beginning of the file
// - before Delphi 2009, the current string code page is used (i.e. CurrentAnsiConvert)
function AnyTextFileToString(const FileName: TFileName; ForceUTF8: boolean): string;
var Map: TMemoryMap;
begin
result := '';
if Map.Map(FileName) then
try
if ForceUTF8 then
{$ifdef UNICODE}
UTF8DecodeToString(PUTF8Char(Map.Buffer),Map.Size,result) {$else}
result := CurrentAnsiConvert.UTF8BufferToAnsi(PUTF8Char(Map.Buffer),Map.Size)
{$endif} else
case TextFileKind(Map) of
{$ifdef UNICODE}
isUnicode:
SetString(result,PWideChar(PtrInt(Map.Buffer)+2),(Map.Size-2) shr 1);
isUTF8:
UTF8DecodeToString(pointer(PtrInt(Map.Buffer)+3),Map.Size-3,result);
isAnsi:
result := CurrentAnsiConvert.AnsiToUnicodeString(Map.Buffer,Map.Size);
{$else}
isUnicode:
result := CurrentAnsiConvert.UnicodeBufferToAnsi(PWideChar(PtrInt(Map.Buffer)+2),(Map.Size-2) shr 1);
isUTF8:
result := CurrentAnsiConvert.UTF8BufferToAnsi(pointer(PtrInt(Map.Buffer)+3),Map.Size-3);
isAnsi:
SetString(result,PAnsiChar(Map.Buffer),Map.Size);
{$endif}
end;
finally
Map.UnMap;
end;
end;
|
|
|
|
Ну, что-то подобное и сделал. Только чуть универсальнее. |
|
|
|
Вроде бы работает. Главное не забывать о ini файлах вообще и maps.ini в частности. |
|
|
(0016698)
|
zed
|
03-11-2015 10:32
|
|
|
|
|
>Т.е. не забывать?
А то что юникодное название карты не из основной локали без проблем отобразится в юникодной версии. Но вот после перезапуска, благодаря Ansi-шности (пока) ini файлов и багу 0002047 это название превратится в знаки вопроса до удаления maps.ini |
|