SASGIS - SAS.Планета |
View Issue Details |
|
ID | Project | Category | View Status | Date Submitted | Last Update |
0002877 | SAS.Планета | [All Projects] Хотелка / Feature request | public | 29-10-2015 11:05 | 03-11-2015 10:55 |
|
Reporter | vdemidov | |
Assigned To | vdemidov | |
Priority | normal | Severity | minor | Reproducibility | always |
Status | resolved | Resolution | fixed | |
Platform | | OS | | OS Version | |
Product Version | 151010 | |
Target Version | 151111 | Fixed in Version | 151111 | |
|
Summary | 0002877: Поддержка utf-8 и utf-16 при загрузке параметров карты в неюникодной версии программы |
Description | Юникодная версия программы получает возможность чтения params.txt в utf-8 и utf-16 за счет стандартной библиотеки. Нужно добавить такую поддержку для неюникодной версии для текстовых файлов которые используются в Read only режиме.
Для этого достаточно добавить в TConfigDataProviderByArchive.GetSubItem и TConfigDataProviderByFolder.GetSubItem перекодировку как это сделано в TKmlInfoSimpleParser.LoadFromStreamInternal только без кодирования в utf-8
Естественно это хозяйство нужно запихать в условную компиляцию, что бы оно даже не компилировалось для более новых компиляторов. |
Steps To Reproduce | |
Additional Information | |
Tags | No tags attached. |
Relationships | related to | 0002690 | resolved | vdemidov | Добавить определение кодировки ini-файлов при загрузке в ConfigDataProvider | child of | 0002166 | resolved | zed | Переход на версию Delphi с полной поддержкой юникода |
|
Attached Files | |
|
Issue History |
Date Modified | Username | Field | Change |
29-10-2015 11:05 | vdemidov | New Issue | |
29-10-2015 11:05 | vdemidov | Relationship added | related to 0002690 |
29-10-2015 11:05 | vdemidov | Relationship added | child of 0002166 |
29-10-2015 11:05 | vdemidov | Status | new => confirmed |
29-10-2015 11:07 | vdemidov | Description Updated | bug_revision_view_page.php?rev_id=6764#r6764 |
30-10-2015 08:53 | vdemidov | Note Added: 0016649 | |
30-10-2015 08:54 | vdemidov | Note Edited: 0016649 | bug_revision_view_page.php?bugnote_id=16649#r6766 |
30-10-2015 08:56 | vdemidov | Note Edited: 0016649 | bug_revision_view_page.php?bugnote_id=16649#r6767 |
30-10-2015 08:58 | vdemidov | Target Version | => 151111 |
30-10-2015 09:05 | zed | Note Added: 0016650 | |
30-10-2015 09:13 | vdemidov | Note Added: 0016651 | |
01-11-2015 11:13 | zed | Note Added: 0016678 | |
01-11-2015 21:37 | vdemidov | Note Added: 0016679 | |
03-11-2015 08:48 | vdemidov | Note Added: 0016693 | |
03-11-2015 08:48 | vdemidov | Status | confirmed => resolved |
03-11-2015 08:48 | vdemidov | Fixed in Version | => 151111 |
03-11-2015 08:48 | vdemidov | Resolution | open => fixed |
03-11-2015 08:48 | vdemidov | Assigned To | => vdemidov |
03-11-2015 10:32 | zed | Note Added: 0016698 | |
03-11-2015 10:55 | vdemidov | Note Added: 0016701 | |
08-08-2025 13:24 | zed | Category | Хотелка => Хотелка / Feature request |
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 |
|