View Issue Details

IDProjectCategoryView StatusLast Update
0001774Far ManagerCodepage Detector (UCD)public2011-10-01 06:59
Reporter2useven10 Assigned Tovskirdin  
PrioritynormalSeverityfeatureReproducibilityN/A
Status closedResolutionfixed 
Product Version3.0 
Fixed in Version3.0 
Summary0001774: Возможность завести 'черный список' кодовых страниц (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, например в редакторе)
TagsNo tags attached.
Build2040

Activities

2useven10

2011-05-18 21:21

developer  

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;
Autodetect-BlackList.diff (2,405 bytes)   

vskirdin

2011-05-19 07:31

administrator   bugnote:0006900

Для чего?

2useven10

2011-05-19 08:15

developer   bugnote:0006902

Last edited: 2011-05-19 08:24

чтобы убрать автоопределение например гречекого (у меня его не бывает) код-пейджа на 1251 файлах (бывает). На форуме есть пара топиков на эту тему.
Вот например: http://forum.farmanager.com/viewtopic.php?f=3&t=5479

JohnDoe

2011-05-19 09:04

updater   bugnote:0006904

>можно задавать кодовые страницы которые будут исключены из UCD автодетекта.
...
>Если UniversalDetector выдаст страницу из этого списка, она будет заменена на умолчательную ANSI или OEM

Вот если бы исключить их в самом детекторе.

2useven10

2011-05-19 09:13

developer   bugnote:0006905

Last edited: 2011-05-19 09:19

с точки зрения производительности выигрыш будет невелик.
а править придется чужой код, который может быть впоследствии изменен...
другое дело, что в этом случае вместо дефолтной могла быть выбрана
другая - более подходящая страница. в любом случае предлагаемое решение гораздо проще в реализации.

max rusov

2011-05-19 10:04

reporter   bugnote:0006907

В FAR'Е есть понятие "любимых" кодировок. Может сделать так, чтобы autodetect выбирал только среди них?

2useven10

2011-05-19 10:37

developer   bugnote:0006911

не знал об этом...
как они задаются?

JohnDoe

2011-05-19 10:48

updater   bugnote:0006913

Last edited: 2011-05-19 10:51

>а править придется чужой код, который может быть впоследствии изменен...
Это конечно серьёзный аргумент...

>другое дело, что в этом случае вместо дефолтной могла быть выбрана другая - более подходящая страница
Именно об этом и речь.

>как они задаются?
На нижней рамке есть подсказка.

vskirdin

2011-05-19 11:10

administrator   bugnote:0006916

Ins - добавляет в фавориты (так же см. Ctrl-H)

2useven10

2011-05-19 11:21

developer   bugnote:0006919

можно и так, хотя возни больше. доп параметр (использовать только любимые ?и системные) всё равно нужен + определение 'класса' код пэйджа.

vskirdin

2011-05-19 11:38

administrator   bugnote:0006922

Хотя да... почему именно привязка к фаворитам?
Автодетект он и в Африке...

> Может сделать так, чтобы autodetect выбирал только среди них?
У меня, например, Hungarian не "любимая" кодировка и че? я должен лишаться возможности... :-)

С другой стороны, как мне кажется, этот функционал лишний. Вот если бы в скорости выигрывали на порядок, тогда ЭТО имело бы смысл.

max rusov

2011-05-19 12:09

reporter   bugnote:0006923

Нечего не лишний. Детектить среди всех существующих кодировок - абсурд. Детект постоянно глючит, выбирая всякие левые кодировки, с которыми я не работал никогда в жизни и не буду. Фильтр _очень_ нужен. Раз уже есть фавориты - использовать их вполне логично, IMHO.

2useven10

2011-05-19 12:14

developer   bugnote:0006924

дефолт будет работать как сейчас. а венгерскую можно и вручную задать, даже если исключения включены и она не в фаворитах.

JohnDoe

2011-05-19 12:38

updater   bugnote:0006925

Last edited: 2011-05-19 12:39

>а венгерскую можно и вручную задать
Зачем вручную. Просто нужна возможность на лету "деактивировать" ограничения.
Тот же Ctrl-H подойдёт, по совместительству.

2useven10

2011-05-19 12:48

developer   bugnote:0006927

Last edited: 2011-05-19 12:52

согласен. так даже доп параметр не нужен и все контролируется уже существующими средствами.
а скорость при детекте оптимизировать нет сысла, не так уж часто он случается (imho).

2useven10

2011-05-19 14:33

developer   bugnote:0006935

есть один минус в фаворитах+системные: там всегда будет присутствовать 65001.
и если UCD её детектирует (скорее всего ошибочно, потому что перед этим идет юникодный детектор, который решил, что 65001 не подходит) отменить это не получится.

2useven10

2011-05-20 08:25

developer  

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;
BlackList-WithFavorites.diff (3,278 bytes)   

2useven10

2011-05-20 08:30

developer   bugnote:0006962

итак: если strNoAutoDetectCP
  "" -- никакой фильтрации UCD автодетекта (это умолчание - как сейчас)
  "-1" -- пропускаются только ACP, OEMCP и любимые если Ctrl-H включен (иначе фильтрации нет)
  "cp1,cp2,..." -- не пропускаются перечисленные в списке

каждый может выбрать режим, который ему больше нравится...

vskirdin

2011-05-20 08:49

administrator   bugnote:0006963

> "-1" -- пропускаются только ACP, OEMCP и любимые если Ctrl-H включен (иначе фильтрации нет)
UTF-8 и прочая униходная предесть будет детектиться?

2useven10

2011-05-20 11:14

developer   bugnote:0006968

Last edited: 2011-05-20 11:14

будет, но не в UCD. Detect юникодов есть отдельно (до UCD) и на него этот фикс никак не влияет. Поэтому (см. выше) если UCD детектит юникод это чаще всего ошибка.

vskirdin

2011-05-20 12:53

administrator   bugnote:0006971

да, кстати, build 2039

2useven10

2011-05-20 14:24

developer   bugnote:0006976

в 2039 этого нет

vskirdin

2011-05-20 14:54

administrator   bugnote:0006977

ессесенно - не я же один коммитер :-)
теперь это 2040

vskirdin

2011-05-20 15:03

administrator   bugnote:0006978

2040

JohnDoe

2011-05-23 17:10

updater   bugnote:0007013

А в интерфейсе это будет?

P.S.
Сейчас настройки кодовых страниц разделены на настройки редактора и настройки вьювера.
Может стоит объединить их?

2 vskirdin: я ни в коем случае не имею ввиду что это надо делать в рамках данного тикета.

Issue History

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