View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0001774 | Far Manager | Codepage Detector (UCD) | public | 2011-05-18 21:21 | 2011-10-01 06:59 |
Reporter | 2useven10 | Assigned To | vskirdin | ||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | closed | Resolution | fixed | ||
Product Version | 3.0 | ||||
Fixed in Version | 3.0 | ||||
Summary | 0001774: Возможность завести 'черный список' кодовых страниц (codepages) autodetect | ||||
Description | В конфиг добавлен текстовый параметр: strNoAutoDetectCP в котором через запятую можно задавать кодовые страницы которые будут исключены из UCD автодетекта. перечисленные здесь кодовые страницы будут исключены из детектирования nsUniversalDetectorEx. автодетект юникодных страниц от этого не зависит, поэтому UTF-8 будет определяться даже если 65001 здесь присутствует. Если UniversalDetector выдаст страницу из этого списка, она будет заменена на умолчательную ANSI или OEM, в зависимости от настроек. умолчание: "" пример: "1250,1252,1253,1255,855,10005,28592,28595,28597,28598,38598,65001" | ||||
Additional Information | Изменения для вьювера - часть 3 (хотя конкретно эти изменения относятся к любому использованию автодетекта UCD, например в редакторе) | ||||
Tags | No tags attached. | ||||
Build | 2040 | ||||
|
Autodetect-BlackList.diff (2,405 bytes)
Index: config.hpp =================================================================== --- config.hpp (revision 6222) +++ config.hpp (working copy) @@ -661,6 +661,12 @@ InfoPanelOptions InfoPanel; DWORD CPMenuMode; + string strNoAutoDetectCP; + // ����������� ���� ������ ������ ����� ������ �� ������������� nsUniversalDetectorEx. + // ���������� ������� ������ �� ����� �� �������, ������ UTF-8 ����� ��������� ���� ���� + // 65001 ���� ������������. ���� UniversalDetector ����� ������� �� ����� ������, ��� ����� + // �������� �� ���������� ANSI ��� OEM, � ����������� �� ��������. + // ������: L"1250,1252,1253,1255,855,10005,28592,28595,28597,28598,38598,65001" bool IsUserAdmin; string strTitleAddons; Index: config.cpp =================================================================== --- config.cpp (revision 6222) +++ config.cpp (working copy) @@ -828,8 +828,9 @@ {0, GeneralConfig::TYPE_INTEGER, NKeyPolicies,L"DisabledOptions",&Opt.Policies.DisabledOptions,0, 0}, {0, GeneralConfig::TYPE_INTEGER, NKeySystem,L"ExcludeCmdHistory",&Opt.ExcludeCmdHistory,0, 0}, //AN - + {1, GeneralConfig::TYPE_INTEGER, NKeyCodePages,L"CPMenuMode",&Opt.CPMenuMode,0,0}, + {1, GeneralConfig::TYPE_TEXT, NKeyCodePages,L"NoAutoDetectCP",&Opt.strNoAutoDetectCP,0,L""}, {1, GeneralConfig::TYPE_TEXT, NKeySystem,L"FolderInfo",&Opt.InfoPanel.strFolderInfoFiles, 0, L"DirInfo,File_Id.diz,Descript.ion,ReadMe.*,Read.Me"}, {1, GeneralConfig::TYPE_INTEGER, NKeyPanelInfo,L"InfoComputerNameFormat",&Opt.InfoPanel.ComputerNameFormat, ComputerNamePhysicalNetBIOS, 0}, Index: filestr.cpp =================================================================== --- filestr.cpp (revision 6222) +++ filestr.cpp (working copy) @@ -36,6 +36,7 @@ #include "filestr.hpp" #include "nsUniversalDetectorEx.hpp" +#include "config.hpp" #define DELTA 1024 @@ -988,6 +989,20 @@ ns->DataEnd(); int cp = ns->getCodePage(); + const wchar_t *deprecated = Opt.strNoAutoDetectCP.CPtr(); + while (*deprecated) + { + while (*deprecated && (*deprecated < L'0' || *deprecated > L'9')) + ++deprecated; + + int dp = (int)wcstol(deprecated, (wchar_t **)&deprecated, 0); + if (cp == dp) + { + cp = -1; + break; + } + } + if (cp != -1) { nCodePage = cp; |
|
Для чего? |
|
чтобы убрать автоопределение например гречекого (у меня его не бывает) код-пейджа на 1251 файлах (бывает). На форуме есть пара топиков на эту тему. Вот например: http://forum.farmanager.com/viewtopic.php?f=3&t=5479 |
|
>можно задавать кодовые страницы которые будут исключены из UCD автодетекта. ... >Если UniversalDetector выдаст страницу из этого списка, она будет заменена на умолчательную ANSI или OEM Вот если бы исключить их в самом детекторе. |
|
с точки зрения производительности выигрыш будет невелик. а править придется чужой код, который может быть впоследствии изменен... другое дело, что в этом случае вместо дефолтной могла быть выбрана другая - более подходящая страница. в любом случае предлагаемое решение гораздо проще в реализации. |
|
В FAR'Е есть понятие "любимых" кодировок. Может сделать так, чтобы autodetect выбирал только среди них? |
|
не знал об этом... как они задаются? |
|
>а править придется чужой код, который может быть впоследствии изменен... Это конечно серьёзный аргумент... >другое дело, что в этом случае вместо дефолтной могла быть выбрана другая - более подходящая страница Именно об этом и речь. >как они задаются? На нижней рамке есть подсказка. |
|
Ins - добавляет в фавориты (так же см. Ctrl-H) |
|
можно и так, хотя возни больше. доп параметр (использовать только любимые ?и системные) всё равно нужен + определение 'класса' код пэйджа. |
|
Хотя да... почему именно привязка к фаворитам? Автодетект он и в Африке... > Может сделать так, чтобы autodetect выбирал только среди них? У меня, например, Hungarian не "любимая" кодировка и че? я должен лишаться возможности... :-) С другой стороны, как мне кажется, этот функционал лишний. Вот если бы в скорости выигрывали на порядок, тогда ЭТО имело бы смысл. |
|
Нечего не лишний. Детектить среди всех существующих кодировок - абсурд. Детект постоянно глючит, выбирая всякие левые кодировки, с которыми я не работал никогда в жизни и не буду. Фильтр _очень_ нужен. Раз уже есть фавориты - использовать их вполне логично, IMHO. |
|
дефолт будет работать как сейчас. а венгерскую можно и вручную задать, даже если исключения включены и она не в фаворитах. |
|
>а венгерскую можно и вручную задать Зачем вручную. Просто нужна возможность на лету "деактивировать" ограничения. Тот же Ctrl-H подойдёт, по совместительству. |
|
согласен. так даже доп параметр не нужен и все контролируется уже существующими средствами. а скорость при детекте оптимизировать нет сысла, не так уж часто он случается (imho). |
|
есть один минус в фаворитах+системные: там всегда будет присутствовать 65001. и если UCD её детектирует (скорее всего ошибочно, потому что перед этим идет юникодный детектор, который решил, что 65001 не подходит) отменить это не получится. |
|
BlackList-WithFavorites.diff (3,278 bytes)
Index: config.cpp =================================================================== --- config.cpp (revision 6234) +++ config.cpp (working copy) @@ -830,6 +830,7 @@ {0, GeneralConfig::TYPE_INTEGER, NKeySystem,L"ExcludeCmdHistory",&Opt.ExcludeCmdHistory,0, 0}, //AN {1, GeneralConfig::TYPE_INTEGER, NKeyCodePages,L"CPMenuMode",&Opt.CPMenuMode,0,0}, + {1, GeneralConfig::TYPE_TEXT, NKeyCodePages,L"NoAutoDetectCP",&Opt.strNoAutoDetectCP,0,L""}, {1, GeneralConfig::TYPE_TEXT, NKeySystem,L"FolderInfo",&Opt.InfoPanel.strFolderInfoFiles, 0, L"DirInfo,File_Id.diz,Descript.ion,ReadMe.*,Read.Me"}, {1, GeneralConfig::TYPE_INTEGER, NKeyPanelInfo,L"InfoComputerNameFormat",&Opt.InfoPanel.ComputerNameFormat, ComputerNamePhysicalNetBIOS, 0}, Index: filestr.cpp =================================================================== --- filestr.cpp (revision 6234) +++ filestr.cpp (working copy) @@ -37,6 +37,10 @@ #include "filestr.hpp" #include "nsUniversalDetectorEx.hpp" +#include "config.hpp" +#include "configdb.hpp" +#include "codepage.hpp" + #define DELTA 1024 enum EolType @@ -987,7 +991,42 @@ ns->HandleData(static_cast<LPCSTR>(Buffer), ReadSize); ns->DataEnd(); int cp = ns->getCodePage(); + if ( cp >= 0 ) + { + const wchar_t *deprecated = Opt.strNoAutoDetectCP.CPtr(); + if ( 0 == wcscmp(deprecated, L"-1") ) + { + if ( Opt.CPMenuMode ) + { + if ( static_cast<UINT>(cp) != GetACP() && static_cast<UINT>(cp) != GetOEMCP() ) + { + int selectType = 0; + wchar_t szcp[16]; + _snwprintf(szcp, ARRAYSIZE(szcp), L"%d", cp); + GeneralCfg->GetValue(FavoriteCodePagesKey, szcp, &selectType, 0); + if (0 == (selectType & CPST_FAVORITE)) + cp = -1; + } + } + } + else + { + while (*deprecated) + { + while (*deprecated && (*deprecated < L'0' || *deprecated > L'9')) + ++deprecated; + + int dp = (int)wcstol(deprecated, (wchar_t **)&deprecated, 0); + if (cp == dp) + { + cp = -1; + break; + } + } + } + } + if (cp != -1) { nCodePage = cp; Index: config.hpp =================================================================== --- config.hpp (revision 6234) +++ config.hpp (working copy) @@ -661,6 +661,15 @@ InfoPanelOptions InfoPanel; DWORD CPMenuMode; + string strNoAutoDetectCP; + // ����������� ���� ������ ������ ����� ������ �� ������������� nsUniversalDetectorEx. + // ���������� ������� ������ �� ����� �� �������, ������ UTF-8 ����� ��������� ���� ���� + // 65001 ���� ������������. ���� UniversalDetector ����� ������� �� ����� ������, ��� ����� + // �������� �� ���������� ANSI ��� OEM, � ����������� �� ��������. + // ������: L"1250,1252,1253,1255,855,10005,28592,28595,28597,28598,38598,65001" + // ���� ������ ����� ������� �������� ����� ������ � UCD ������� �� �����. + // ���� "-1", �� � ����������� CPMenuMode (Ctrl-H � ��� ����� ������ ������� UCD ���� ����� + // �������, ���� ����� �������� ����� '�����' � �������� (OEM ANSI) ������ ������. bool IsUserAdmin; string strTitleAddons; |
|
итак: если strNoAutoDetectCP "" -- никакой фильтрации UCD автодетекта (это умолчание - как сейчас) "-1" -- пропускаются только ACP, OEMCP и любимые если Ctrl-H включен (иначе фильтрации нет) "cp1,cp2,..." -- не пропускаются перечисленные в списке каждый может выбрать режим, который ему больше нравится... |
|
> "-1" -- пропускаются только ACP, OEMCP и любимые если Ctrl-H включен (иначе фильтрации нет) UTF-8 и прочая униходная предесть будет детектиться? |
|
будет, но не в UCD. Detect юникодов есть отдельно (до UCD) и на него этот фикс никак не влияет. Поэтому (см. выше) если UCD детектит юникод это чаще всего ошибка. |
|
да, кстати, build 2039 |
|
в 2039 этого нет |
|
ессесенно - не я же один коммитер :-) теперь это 2040 |
|
2040 |
|
А в интерфейсе это будет? P.S. Сейчас настройки кодовых страниц разделены на настройки редактора и настройки вьювера. Может стоит объединить их? 2 vskirdin: я ни в коем случае не имею ввиду что это надо делать в рамках данного тикета. |
Date Modified | Username | Field | Change |
---|---|---|---|
2011-05-18 21:21 | 2useven10 | New Issue | |
2011-05-18 21:21 | 2useven10 | File Added: Autodetect-BlackList.diff | |
2011-05-19 07:31 | vskirdin | Note Added: 0006900 | |
2011-05-19 08:15 | 2useven10 | Note Added: 0006902 | |
2011-05-19 08:24 | 2useven10 | Note Edited: 0006902 | |
2011-05-19 09:04 | JohnDoe | Note Added: 0006904 | |
2011-05-19 09:13 | 2useven10 | Note Added: 0006905 | |
2011-05-19 09:19 | 2useven10 | Note Edited: 0006905 | |
2011-05-19 10:04 | max rusov | Note Added: 0006907 | |
2011-05-19 10:37 | 2useven10 | Note Added: 0006911 | |
2011-05-19 10:48 | JohnDoe | Note Added: 0006913 | |
2011-05-19 10:51 | JohnDoe | Note Edited: 0006913 | |
2011-05-19 11:10 | vskirdin | Note Added: 0006916 | |
2011-05-19 11:21 | 2useven10 | Note Added: 0006919 | |
2011-05-19 11:38 | vskirdin | Note Added: 0006922 | |
2011-05-19 12:09 | max rusov | Note Added: 0006923 | |
2011-05-19 12:14 | 2useven10 | Note Added: 0006924 | |
2011-05-19 12:38 | JohnDoe | Note Added: 0006925 | |
2011-05-19 12:39 | JohnDoe | Note Edited: 0006925 | |
2011-05-19 12:48 | 2useven10 | Note Added: 0006927 | |
2011-05-19 12:52 | 2useven10 | Note Edited: 0006927 | |
2011-05-19 14:33 | 2useven10 | Note Added: 0006935 | |
2011-05-20 08:25 | 2useven10 | File Added: BlackList-WithFavorites.diff | |
2011-05-20 08:30 | 2useven10 | Note Added: 0006962 | |
2011-05-20 08:49 | vskirdin | Note Added: 0006963 | |
2011-05-20 11:14 | 2useven10 | Note Added: 0006968 | |
2011-05-20 11:14 | 2useven10 | Note Edited: 0006968 | |
2011-05-20 12:53 | vskirdin | Note Added: 0006971 | |
2011-05-20 12:53 | vskirdin | Assigned To | => vskirdin |
2011-05-20 12:53 | vskirdin | Status | new => feedback |
2011-05-20 14:24 | 2useven10 | Note Added: 0006976 | |
2011-05-20 14:24 | 2useven10 | Status | feedback => assigned |
2011-05-20 14:54 | vskirdin | Note Added: 0006977 | |
2011-05-20 15:03 | vskirdin | Note Added: 0006978 | |
2011-05-20 15:03 | vskirdin | Status | assigned => feedback |
2011-05-23 17:10 | JohnDoe | Note Added: 0007013 | |
2011-09-30 22:26 | 2useven10 | Status | feedback => resolved |
2011-10-01 06:59 | vskirdin | Build | => 2040 |
2011-10-01 06:59 | vskirdin | Status | resolved => closed |
2011-10-01 06:59 | vskirdin | Resolution | open => fixed |
2011-10-01 06:59 | vskirdin | Fixed in Version | => 3.0 |