diff --git a/Build/Notepad3.ini b/Build/Notepad3.ini index c7b555462..e53bf1105 100644 --- a/Build/Notepad3.ini +++ b/Build/Notepad3.ini @@ -3,6 +3,7 @@ ;Notepad3.ini=%APPDATA%\Rizonesoft\Notepad3\Notepad3.ini [Settings] SettingsVersion=5 +;AnalyzeReliableConfidenceLevel=50 [Settings2] ;IMEInteraction=0 ;DateTimeFormat= ;(-> ) @@ -58,7 +59,6 @@ SettingsVersion=5 ;UndoTransactionTimeout=0 ;in [msec] ;AdministrationTool.exe= ;DevDebugMode=0 -;AnalyzeReliableConfidenceLevel=66 ;LocaleAnsiCodePageAnalysisBonus=33 ;UchardetLanguageFilter=31 ; Bitmask controlling which CJK charset probers are active in uchardet: diff --git a/doc/Configuration.md b/doc/Configuration.md index 33a277fe0..b410d83ce 100644 --- a/doc/Configuration.md +++ b/doc/Configuration.md @@ -28,6 +28,10 @@ These settings are managed through Notepad3's user interface (Menu → Settings) #### `Favorites=%APPDATA%\Rizonesoft\Notepad3\Favorites\` +#### `AnalyzeReliableConfidenceLevel=50` + +Confidence threshold (0–100) for the encoding analysis reliability indicator. Configurable in Menu → Settings → Encoding Defaults, next to "Perform ANSI Code Page analysis". + --- ## `[Settings2]` @@ -361,10 +365,6 @@ Reserved for future use. Show encoding detector (UCHARDET) info in the title bar for debugging. -#### `AnalyzeReliableConfidenceLevel=66` - -Confidence threshold for the encoding reliability indicator. - #### `LocaleAnsiCodePageAnalysisBonus=33` Bias added to confidence when the system's ANSI code page matches the detected encoding. diff --git a/language/common_res.h b/language/common_res.h index 8f434e558..745f90bd6 100644 --- a/language/common_res.h +++ b/language/common_res.h @@ -472,6 +472,8 @@ #define IDC_FILE_CHECK_INTERVAL 18135 #define IDC_DARK_MODE_CONTRAST 18136 #define IDC_TAB_BACKTAB_INDENTS_ALWAYS 18137 +#define IDC_ANSI_CONFIDENCE_LEVEL 18138 +#define IDC_ANSI_CONFIDENCE_SPIN 18139 #define IDC_RADIO_BTN_A 18200 #define IDC_RADIO_BTN_B 18201 diff --git a/language/np3_af_za/dialogs_af_za.rc b/language/np3_af_za/dialogs_af_za.rc index c9990874f..1b61e97df 100644 --- a/language/np3_af_za/dialogs_af_za.rc +++ b/language/np3_af_za/dialogs_af_za.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,155,10 CONTROL "Voer &ANSI-kodebladanalise uit",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,155,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Aktiveer opsporing van &UNICODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,155,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_be_by/dialogs_be_by.rc b/language/np3_be_by/dialogs_be_by.rc index 216af6112..c534d5059 100644 --- a/language/np3_be_by/dialogs_be_by.rc +++ b/language/np3_be_by/dialogs_be_by.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,114,10 CONTROL "Вызначаць кодавую старонку &ANSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,137,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Уключыць вызначэнне &UNICODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,127,10 DEFPUSHBUTTON "OK",IDOK,101,151,50,14 diff --git a/language/np3_de_de/dialogs_de_de.rc b/language/np3_de_de/dialogs_de_de.rc index ef802809b..90830b2bc 100644 --- a/language/np3_de_de/dialogs_de_de.rc +++ b/language/np3_de_de/dialogs_de_de.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,165,10 CONTROL "Führe &ANSI Code-Page Analyse durch",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,165,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Erlaube &UNICODE Erkennung",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,95,151,50,14 diff --git a/language/np3_el_gr/dialogs_el_gr.rc b/language/np3_el_gr/dialogs_el_gr.rc index 775366d22..24056e714 100644 --- a/language/np3_el_gr/dialogs_el_gr.rc +++ b/language/np3_el_gr/dialogs_el_gr.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,160,10 CONTROL "Εκτέλεση ανάλυσης κωδικοσελίδας A&ΝSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,150,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Ενεργοποίηση εντοπισμού UN&ΙCODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,138,10 DEFPUSHBUTTON "&Εντάξει",IDOK,102,151,50,14 diff --git a/language/np3_en_gb/dialogs_en_gb.rc b/language/np3_en_gb/dialogs_en_gb.rc index 06d38045c..f211473af 100644 --- a/language/np3_en_gb/dialogs_en_gb.rc +++ b/language/np3_en_gb/dialogs_en_gb.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,126,10 CONTROL "Perform &ANSI Code Page analysis",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,122,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Enable &UNICODE detection",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_en_us/dialogs_en_us.rc b/language/np3_en_us/dialogs_en_us.rc index fac4fca4c..364b17b71 100644 --- a/language/np3_en_us/dialogs_en_us.rc +++ b/language/np3_en_us/dialogs_en_us.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,126,10 CONTROL "Perform &ANSI Code Page analysis",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,122,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Enable &UNICODE detection",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_es_es/dialogs_es_es.rc b/language/np3_es_es/dialogs_es_es.rc index 517e9b64d..139083fd5 100644 --- a/language/np3_es_es/dialogs_es_es.rc +++ b/language/np3_es_es/dialogs_es_es.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,180,10 CONTROL "Realizar el análisis de la página de códigos ANSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,180,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Habilitar la detección &UNICODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "Aceptar",IDOK,87,151,50,14 diff --git a/language/np3_fi_fi/dialogs_fi_fi.rc b/language/np3_fi_fi/dialogs_fi_fi.rc index c4deec1fd..5e02da977 100644 --- a/language/np3_fi_fi/dialogs_fi_fi.rc +++ b/language/np3_fi_fi/dialogs_fi_fi.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,126,10 CONTROL "Suorita &ANSI-koodisivuanalyysi",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,122,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Ota &UNICODE-tunnistus käyttöön",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,92,151,50,14 diff --git a/language/np3_fr_fr/dialogs_fr_fr.rc b/language/np3_fr_fr/dialogs_fr_fr.rc index 04d605be9..34255df91 100644 --- a/language/np3_fr_fr/dialogs_fr_fr.rc +++ b/language/np3_fr_fr/dialogs_fr_fr.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,168,10 CONTROL "Effectuer une analyse de code page &ANSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,155,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Activer la détection &UNICODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_hi_in/dialogs_hi_in.rc b/language/np3_hi_in/dialogs_hi_in.rc index 5781a8823..1182c22ba 100644 --- a/language/np3_hi_in/dialogs_hi_in.rc +++ b/language/np3_hi_in/dialogs_hi_in.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,126,10 CONTROL "ANSI कोड पेज का विश्लेषण करें (&A)",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,122,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "युनिकोड पहचान सक्षम करें (&U)",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "सही है",IDOK,87,151,50,14 diff --git a/language/np3_hu_hu/dialogs_hu_hu.rc b/language/np3_hu_hu/dialogs_hu_hu.rc index 88459c4eb..3834db7fb 100644 --- a/language/np3_hu_hu/dialogs_hu_hu.rc +++ b/language/np3_hu_hu/dialogs_hu_hu.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,155,10 CONTROL "&ANSI kódlap elemzés végrehajtása",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,132,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "&UNICODE detektálás engedélyezése",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,132,10 DEFPUSHBUTTON "OK",IDOK,100,151,50,14 diff --git a/language/np3_id_id/dialogs_id_id.rc b/language/np3_id_id/dialogs_id_id.rc index afcdd354c..c72cadf6a 100644 --- a/language/np3_id_id/dialogs_id_id.rc +++ b/language/np3_id_id/dialogs_id_id.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,126,10 CONTROL "Lakukan analisis Halaman Kode &ANSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,140,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Aktifkan deteksi &UNICODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_it_it/dialogs_it_it.rc b/language/np3_it_it/dialogs_it_it.rc index c34bb924b..83f6e0457 100644 --- a/language/np3_it_it/dialogs_it_it.rc +++ b/language/np3_it_it/dialogs_it_it.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,155,10 CONTROL "Esegui l'analisi delle pagine di codice &ANSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,165,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Attiva rilevamento &Unicode",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,97,151,50,14 diff --git a/language/np3_ja_jp/dialogs_ja_jp.rc b/language/np3_ja_jp/dialogs_ja_jp.rc index 54ad1c46c..c3ac2f615 100644 --- a/language/np3_ja_jp/dialogs_ja_jp.rc +++ b/language/np3_ja_jp/dialogs_ja_jp.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,153,10 CONTROL "ANSI を判別(&A)",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,122,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Unicode を判別(&U)",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_ko_kr/dialogs_ko_kr.rc b/language/np3_ko_kr/dialogs_ko_kr.rc index 3f4c731f6..90e8a8f74 100644 --- a/language/np3_ko_kr/dialogs_ko_kr.rc +++ b/language/np3_ko_kr/dialogs_ko_kr.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,164,10 CONTROL "ANSI 코드 페이지 분석 수행(&A)",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,164,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "UNICODE 감지 사용(&U)",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,164,10 DEFPUSHBUTTON "확인",IDOK,87,151,50,14 diff --git a/language/np3_nl_nl/dialogs_nl_nl.rc b/language/np3_nl_nl/dialogs_nl_nl.rc index 9e897d8b4..7109ab384 100644 --- a/language/np3_nl_nl/dialogs_nl_nl.rc +++ b/language/np3_nl_nl/dialogs_nl_nl.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,140,10 CONTROL "Analyse van &ANSI-codepagina uitvoeren",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,145,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "&UNICODE-detectie inschakelen",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,98,151,50,14 diff --git a/language/np3_pl_pl/dialogs_pl_pl.rc b/language/np3_pl_pl/dialogs_pl_pl.rc index dd6959c94..fa065b72c 100644 --- a/language/np3_pl_pl/dialogs_pl_pl.rc +++ b/language/np3_pl_pl/dialogs_pl_pl.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,126,10 CONTROL "Wykonaj analizę strony kodowej &ANSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,140,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Włącz wykrywanie &UNICODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_pt_br/dialogs_pt_br.rc b/language/np3_pt_br/dialogs_pt_br.rc index 5cc9b80c0..c25a7e8ea 100644 --- a/language/np3_pt_br/dialogs_pt_br.rc +++ b/language/np3_pt_br/dialogs_pt_br.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,130,10 CONTROL "Executar análise de Página de Código &ANSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,160,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Habilitar detecção de &UNICODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,130,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_pt_pt/dialogs_pt_pt.rc b/language/np3_pt_pt/dialogs_pt_pt.rc index 1bcf4aa9e..db46a791e 100644 --- a/language/np3_pt_pt/dialogs_pt_pt.rc +++ b/language/np3_pt_pt/dialogs_pt_pt.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,165,10 CONTROL "Efectuar análise de página de código &ANSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,160,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Activar detecção &UNICODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_ru_ru/dialogs_ru_ru.rc b/language/np3_ru_ru/dialogs_ru_ru.rc index d8edd6c5d..091502e3e 100644 --- a/language/np3_ru_ru/dialogs_ru_ru.rc +++ b/language/np3_ru_ru/dialogs_ru_ru.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,123,10 CONTROL "Определять кодовую страницу &ANSI",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,142,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Включить определение &UNICODE",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,129,10 DEFPUSHBUTTON "OK",IDOK,101,151,50,14 diff --git a/language/np3_sk_sk/dialogs_sk_sk.rc b/language/np3_sk_sk/dialogs_sk_sk.rc index 3497de8e1..a054361f4 100644 --- a/language/np3_sk_sk/dialogs_sk_sk.rc +++ b/language/np3_sk_sk/dialogs_sk_sk.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,135,10 CONTROL "A&nalyzovať ANSI kódovanej stránky",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,130,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Povoliť &UNICODE detekciu",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_sv_se/dialogs_sv_se.rc b/language/np3_sv_se/dialogs_sv_se.rc index 3172a06de..3a3baa282 100644 --- a/language/np3_sv_se/dialogs_sv_se.rc +++ b/language/np3_sv_se/dialogs_sv_se.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,126,10 CONTROL "Gör analys av ANSI-kodsida",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,122,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Aktiviera UNICODE-identifiering",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "OK",IDOK,87,151,50,14 diff --git a/language/np3_tr_tr/dialogs_tr_tr.rc b/language/np3_tr_tr/dialogs_tr_tr.rc index 28c8ebd31..818ad439e 100644 --- a/language/np3_tr_tr/dialogs_tr_tr.rc +++ b/language/np3_tr_tr/dialogs_tr_tr.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,130,10 CONTROL "&ANSI kod sayfası incelensin",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,122,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "&UNICODE algılaması yapılsın",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "Tamam",IDOK,87,151,50,14 diff --git a/language/np3_vi_vn/dialogs_vi_vn.rc b/language/np3_vi_vn/dialogs_vi_vn.rc index 557881b46..451225f46 100644 --- a/language/np3_vi_vn/dialogs_vi_vn.rc +++ b/language/np3_vi_vn/dialogs_vi_vn.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,164,10 CONTROL "Thực hiện phân tích mã hóa ANSI(&A)",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,164,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "Sử dụng phát hiện UNICODE(&U)",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,164,10 DEFPUSHBUTTON "Đồng ý",IDOK,87,151,50,14 diff --git a/language/np3_zh_cn/dialogs_zh_cn.rc b/language/np3_zh_cn/dialogs_zh_cn.rc index 49058a1fa..83e2b035d 100644 --- a/language/np3_zh_cn/dialogs_zh_cn.rc +++ b/language/np3_zh_cn/dialogs_zh_cn.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,166,10 CONTROL "分析 ANSI 代码页(&A)",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,166,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "检测 Unicode(&U)",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,166,10 DEFPUSHBUTTON "确定",IDOK,87,151,50,14 diff --git a/language/np3_zh_tw/dialogs_zh_tw.rc b/language/np3_zh_tw/dialogs_zh_tw.rc index 4f0353133..f844efee1 100644 --- a/language/np3_zh_tw/dialogs_zh_tw.rc +++ b/language/np3_zh_tw/dialogs_zh_tw.rc @@ -198,6 +198,8 @@ BEGIN "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,106,126,10 CONTROL "分析 ANSI 內碼表(&A)",IDC_NOANSICPDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,118,122,10 + EDITTEXT IDC_ANSI_CONFIDENCE_LEVEL,140,117,28,12,ES_AUTOHSCROLL | ES_NUMBER + CONTROL "",IDC_ANSI_CONFIDENCE_SPIN,"msctls_updown32",UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | UDS_HOTTRACK,156,116,11,14 CONTROL "檢測 Unicode(&U)",IDC_NOUNICODEDETECTION, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,130,122,10 DEFPUSHBUTTON "確定",IDOK,87,151,50,14 diff --git a/src/Config/Config.cpp b/src/Config/Config.cpp index 52b216e95..d5fddd7e6 100644 --- a/src/Config/Config.cpp +++ b/src/Config/Config.cpp @@ -349,7 +349,7 @@ extern "C" bool SaveIniFileCache(const HPATHL hpthIniFile) } -//============================================================================= +// ============================================================================= // // OpenSettingsFile() // @@ -393,7 +393,7 @@ extern "C" bool OpenSettingsFile(LPCSTR fctname) } -//============================================================================= +// ============================================================================= // // CloseSettingsFile() // @@ -438,11 +438,11 @@ extern "C" bool CloseSettingsFile(LPCSTR fctname, bool bSaveSettings) -//============================================================================= +// ============================================================================= // // Manipulation of (cached) ini file // -//============================================================================= +// ============================================================================= extern "C" size_t IniSectionGetString(LPCWSTR lpSectionName, LPCWSTR lpKeyName, LPCWSTR lpDefault, @@ -840,7 +840,7 @@ extern "C" bool IniFileIterateSection(const HPATHL hpthIniFile, LPCWSTR lpSectio -//============================================================================= +// ============================================================================= // // AddFilePathToRecentDocs() // @@ -876,7 +876,7 @@ extern "C" void AddFilePathToRecentDocs(const HPATHL hpthFile) #if 0 -//============================================================================= +// ============================================================================= // // ClearDestinationsOnRecentDocs() // @@ -899,7 +899,7 @@ extern "C" void ClearDestinationsOnRecentDocs() #endif -//============================================================================= +// ============================================================================= // // _CheckAndSetIniFile() // @@ -1000,11 +1000,15 @@ static bool _HandleIniFileRedirect(LPCWSTR lpszSecName, LPCWSTR lpszKeyName, HPA } // pick up DefaultDirectory from each redirecting INI (later files override earlier ones) - WCHAR defDir[PATHLONG_MAX_CCH] = { L'\0' }; - if (IniFileGetString(hpth_in_out, Constants.Settings2_Section, L"DefaultDirectory", L"", defDir, COUNTOF(defDir))) { - Path_Reset(Settings2.DefaultDirectory, defDir); + HPATHL hdefDir = Path_Allocate(NULL); + LPWSTR const defDirBuf = Path_WriteAccessBuf(hdefDir, PATHLONG_MAX_CCH); + if (IniFileGetString(hpth_in_out, Constants.Settings2_Section, L"DefaultDirectory", L"", defDirBuf, PATHLONG_MAX_CCH)) { + Path_Sanitize(hdefDir); + Path_FreeExtra(hdefDir, 0); + Path_Reset(Settings2.DefaultDirectory, Path_Get(hdefDir)); Path_ExpandEnvStrings(Settings2.DefaultDirectory); } + Path_Release(hdefDir); HPATHL hredirect = Path_Allocate(NULL); LPWSTR const buf = Path_WriteAccessBuf(hredirect, PATHLONG_MAX_CCH); @@ -1040,7 +1044,7 @@ static bool _HandleIniFileRedirect(LPCWSTR lpszSecName, LPCWSTR lpszKeyName, HPA } return result; } -// ============================================================================ +// ============================================================================= extern "C" bool FindIniFile() @@ -1087,7 +1091,7 @@ extern "C" bool FindIniFile() return bFound; } -//============================================================================= +// ============================================================================= extern "C" bool TestIniFile() @@ -1108,7 +1112,7 @@ extern "C" bool TestIniFile() return true; } -//============================================================================= +// ============================================================================= extern "C" bool CreateIniFile(const HPATHL hini_pth, DWORD* pdwFileSize_out) @@ -1174,10 +1178,10 @@ extern "C" bool CreateIniFile(const HPATHL hini_pth, DWORD* pdwFileSize_out) } return false; } -//============================================================================= +// ============================================================================= -//============================================================================= +// ============================================================================= // // LoadSettings() // @@ -1374,8 +1378,6 @@ void LoadSettings() Settings2.SubWrappedLineSelectOnMarginClick = IniSectionGetBool(IniSecSettings2, L"SubWrappedLineSelectOnMarginClick", false); - Settings2.AnalyzeReliableConfidenceLevel = (float)clampi(IniSectionGetInt(IniSecSettings2, L"AnalyzeReliableConfidenceLevel", 66), 0, 100) / 100.0f; - int const iAnsiCPBonusSet = clampi(IniSectionGetInt(IniSecSettings2, L"LocaleAnsiCodePageAnalysisBonus", 33), 0, 100); Settings2.LocaleAnsiCodePageAnalysisBonus = (float)iAnsiCPBonusSet / 100.0f; @@ -1725,6 +1727,14 @@ void LoadSettings() GET_BOOL_VALUE_FROM_INISECTION(NoEncodingTags, true); GET_BOOL_VALUE_FROM_INISECTION(SkipUnicodeDetection, false); GET_BOOL_VALUE_FROM_INISECTION(SkipANSICodePageDetection, false); + GET_INT_VALUE_FROM_INISECTION(AnalyzeReliableConfidenceLevel, 50, 0, 100); + constexpr const WCHAR* const arcl_s2 = L"AnalyzeReliableConfidenceLevel"; + int const deprecatedARCL = IniSectionGetInt(IniSecSettings2, arcl_s2, -1); + if (deprecatedARCL >= 0) { + Settings.AnalyzeReliableConfidenceLevel = clampi(deprecatedARCL, 0, 100); + IniSectionDelete(IniSecSettings2, arcl_s2, true); + bDirtyFlag = true; + } GET_INT_VALUE_FROM_INISECTION(DefaultEOLMode, SC_EOL_CRLF, SC_EOL_CRLF, SC_EOL_LF); GET_BOOL_VALUE_FROM_INISECTION(WarnInconsistEOLs, true); GET_BOOL_VALUE_FROM_INISECTION(FixLineEndings, false); @@ -1973,11 +1983,11 @@ void LoadSettings() FreeMem(pPathBuffer); } -//============================================================================= +// ============================================================================= -//============================================================================= +// ============================================================================= // // _SaveSettings() // @@ -2163,6 +2173,7 @@ static bool _SaveSettings(bool bForceSaveSettings) SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, NoEncodingTags); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, SkipUnicodeDetection); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, SkipANSICodePageDetection); + SAVE_VALUE_IF_NOT_EQ_DEFAULT(Int, AnalyzeReliableConfidenceLevel); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Int, DefaultEOLMode); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, WarnInconsistEOLs); SAVE_VALUE_IF_NOT_EQ_DEFAULT(Bool, FixLineEndings); @@ -2271,7 +2282,7 @@ static bool _SaveSettings(bool bForceSaveSettings) int const ResX = GetSystemMetrics(SM_CXVIRTUALSCREEN); int const ResY = GetSystemMetrics(SM_CYVIRTUALSCREEN); - WCHAR tchHighDpiToolBar[64]; + WCHAR tchHighDpiToolBar[64] = { L'\0' }; StringCchPrintf(tchHighDpiToolBar, COUNTOF(tchHighDpiToolBar), L"%ix%i HighDpiToolBar", ResX, ResY); if (Settings.ToolBarTheme != Defaults.ToolBarTheme) { IniSectionSetInt(IniSecWindow, tchHighDpiToolBar, Settings.ToolBarTheme); @@ -2307,7 +2318,7 @@ static bool _SaveSettings(bool bForceSaveSettings) } -//============================================================================= +// ============================================================================= // // SaveWindowPositionSettings() // @@ -2357,7 +2368,7 @@ bool SaveWindowPositionSettings(bool bClearSettings) } -//============================================================================= +// ============================================================================= // // SaveAllSettings() // @@ -2427,7 +2438,7 @@ bool SaveAllSettings(bool bForceSaveSettings) -//============================================================================= +// ============================================================================= // // CmdSaveSettingsNow() // @@ -2485,11 +2496,11 @@ void CmdSaveSettingsNow() } -//============================================================================= -//============================================================================= +// ============================================================================= +// ============================================================================= -//============================================================================= +// ============================================================================= // // MRU functions // @@ -2897,7 +2908,7 @@ bool MRU_MergeSave(LPMRULIST pmru, bool bAddFiles, bool bRelativePath, bool bUne // Some C++ Extentions for Notepad3 // //////////////////////////////////////////////////////////////////////////// -//============================================================================= +// ============================================================================= // // EditSetDocumentBuffer() - Set Document Buffer for Scintilla Edit Component // diff --git a/src/Dialogs.c b/src/Dialogs.c index fdfdbd781..cf6091b26 100644 --- a/src/Dialogs.c +++ b/src/Dialogs.c @@ -3444,7 +3444,8 @@ static INT_PTR CALLBACK SelectDefEncodingDlgProc(HWND hwnd, UINT umsg, WPARAM wP //~SetExplorerTheme(GetDlgItem(hwnd, IDC_ENCODINGLIST)); ~ OWNERDRAWN -> WM_DRAWITEM //SetExplorerTheme(GetDlgItem(hwnd, IDC_RESIZEGRIP)); int const ctl[] = { IDC_ENCODINGLIST, IDC_USEASREADINGFALLBACK, IDC_ASCIIASUTF8, IDC_RELIABLE_DETECTION_RES, - IDC_NFOASOEM, IDC_ENCODINGFROMFILEVARS, IDC_NOUNICODEDETECTION, IDC_NOANSICPDETECTION, IDC_STATIC, IDC_STATIC2 + IDC_NFOASOEM, IDC_ENCODINGFROMFILEVARS, IDC_NOUNICODEDETECTION, IDC_NOANSICPDETECTION, + IDC_ANSI_CONFIDENCE_LEVEL, IDC_STATIC, IDC_STATIC2 }; for (int i = 0; i < COUNTOF(ctl); ++i) { SetWindowTheme(GetDlgItem(hwnd, ctl[i]), L"", L""); // remove theme for BS_AUTORADIOBUTTON @@ -3467,9 +3468,9 @@ static INT_PTR CALLBACK SelectDefEncodingDlgProc(HWND hwnd, UINT umsg, WPARAM wP Encoding_GetFromComboboxEx(GetDlgItem(hwnd, IDC_ENCODINGLIST), &s_iEnc); s_bLoadASCIIasUTF8 = Settings.LoadASCIIasUTF8; - s_bUseAsFallback = Encoding_IsASCII(s_iEnc) ? Settings.UseDefaultForFileEncoding : false; + s_bUseAsFallback = Encoding_HasASCII7Bit(s_iEnc) ? Settings.UseDefaultForFileEncoding : false; - DialogEnableControl(hwnd, IDC_USEASREADINGFALLBACK, Encoding_IsASCII(s_iEnc)); + DialogEnableControl(hwnd, IDC_USEASREADINGFALLBACK, Encoding_HasASCII7Bit(s_iEnc)); CheckDlgButton(hwnd, IDC_USEASREADINGFALLBACK, SetBtn(s_bUseAsFallback)); CheckDlgButton(hwnd, IDC_ASCIIASUTF8, SetBtn(s_bLoadASCIIasUTF8)); @@ -3479,6 +3480,12 @@ static INT_PTR CALLBACK SelectDefEncodingDlgProc(HWND hwnd, UINT umsg, WPARAM wP CheckDlgButton(hwnd, IDC_NOUNICODEDETECTION, SetBtn(!Settings.SkipUnicodeDetection)); CheckDlgButton(hwnd, IDC_NOANSICPDETECTION, SetBtn(!Settings.SkipANSICodePageDetection)); + SendDlgItemMessage(hwnd, IDC_ANSI_CONFIDENCE_LEVEL, EM_LIMITTEXT, 3, 0); + SendDlgItemMessage(hwnd, IDC_ANSI_CONFIDENCE_SPIN, UDM_SETRANGE32, 0, 100); + SendDlgItemMessage(hwnd, IDC_ANSI_CONFIDENCE_SPIN, UDM_SETPOS32, 0, Settings.AnalyzeReliableConfidenceLevel); + DialogEnableControl(hwnd, IDC_ANSI_CONFIDENCE_LEVEL, !Settings.SkipANSICodePageDetection); + DialogEnableControl(hwnd, IDC_ANSI_CONFIDENCE_SPIN, !Settings.SkipANSICodePageDetection); + CenterDlgInParent(hwnd, false); } return TRUE; @@ -3545,10 +3552,10 @@ static INT_PTR CALLBACK SelectDefEncodingDlgProc(HWND hwnd, UINT umsg, WPARAM wP case IDC_ASCIIASUTF8: { Encoding_GetFromComboboxEx(GetDlgItem(hwnd, IDC_ENCODINGLIST), &s_iEnc); - s_bUseAsFallback = Encoding_IsASCII(s_iEnc) ? IsButtonChecked(hwnd, IDC_USEASREADINGFALLBACK) : false; + s_bUseAsFallback = Encoding_HasASCII7Bit(s_iEnc) ? IsButtonChecked(hwnd, IDC_USEASREADINGFALLBACK) : false; s_bLoadASCIIasUTF8 = IsButtonChecked(hwnd, IDC_ASCIIASUTF8); - DialogEnableControl(hwnd, IDC_USEASREADINGFALLBACK, Encoding_IsASCII(s_iEnc)); + DialogEnableControl(hwnd, IDC_USEASREADINGFALLBACK, Encoding_HasASCII7Bit(s_iEnc)); CheckDlgButton(hwnd, IDC_USEASREADINGFALLBACK, SetBtn(s_bUseAsFallback)); DialogEnableControl(hwnd, IDC_ASCIIASUTF8, true); @@ -3570,6 +3577,13 @@ static INT_PTR CALLBACK SelectDefEncodingDlgProc(HWND hwnd, UINT umsg, WPARAM wP } break; + case IDC_NOANSICPDETECTION: { + bool const bAnsiCpEnabled = IsButtonChecked(hwnd, IDC_NOANSICPDETECTION); + DialogEnableControl(hwnd, IDC_ANSI_CONFIDENCE_LEVEL, bAnsiCpEnabled); + DialogEnableControl(hwnd, IDC_ANSI_CONFIDENCE_SPIN, bAnsiCpEnabled); + } + break; + case IDOK: { PENCODEDLG pdd = (PENCODEDLG)GetWindowLongPtr(hwnd, DWLP_USER); if (Encoding_GetFromComboboxEx(GetDlgItem(hwnd, IDC_ENCODINGLIST), &pdd->idEncoding)) { @@ -3584,6 +3598,7 @@ static INT_PTR CALLBACK SelectDefEncodingDlgProc(HWND hwnd, UINT umsg, WPARAM wP Settings.NoEncodingTags = !IsButtonChecked(hwnd, IDC_ENCODINGFROMFILEVARS); Settings.SkipUnicodeDetection = !IsButtonChecked(hwnd, IDC_NOUNICODEDETECTION); Settings.SkipANSICodePageDetection = !IsButtonChecked(hwnd, IDC_NOANSICPDETECTION); + Settings.AnalyzeReliableConfidenceLevel = clampi((int)SendDlgItemMessage(hwnd, IDC_ANSI_CONFIDENCE_SPIN, UDM_GETPOS32, 0, 0), 0, 100); EndDialog(hwnd, IDOK); } } else { diff --git a/src/Edit.c b/src/Edit.c index c27961e52..a1d6c4fa6 100644 --- a/src/Edit.c +++ b/src/Edit.c @@ -581,7 +581,7 @@ bool EditSetNewEncoding(HWND hwnd, cpi_enc_t iNewEncoding, bool bSupressWarning) } else { if (!bSupressWarning) { - bool const bIsCurANSI = Encoding_IsANSI(iCurrentEncoding); + bool const bIsCurANSI = Encoding_IsSystemANSI_CP(iCurrentEncoding); bool const bIsTargetUTF = Encoding_MaybeUTF8(iNewEncoding) || Encoding_IsUNICODE(iNewEncoding); bSupressWarning = bIsCurANSI && bIsTargetUTF; } @@ -1518,7 +1518,7 @@ bool EditLoadFile( status->iEncoding = encDetection.Encoding; // UCHARDET was called but returned no result — file is likely binary - if (Encoding_IsANSI(status->iEncoding) && encDetection.bIsAnalyzed && Encoding_IsNONE(encDetection.analyzedEncoding)) { + if (Encoding_IsEXTERNAL_8BIT(status->iEncoding) && encDetection.bIsAnalyzed && Encoding_IsNONE(encDetection.analyzedEncoding)) { status->bMaybeBinary = true; } diff --git a/src/Encoding.c b/src/Encoding.c index bd4ef154f..3e3d88a86 100644 --- a/src/Encoding.c +++ b/src/Encoding.c @@ -276,9 +276,9 @@ void Encoding_SetLabel(cpi_enc_t iEncoding) WCHAR wch2[128] = { L'\0' }; StringCchCopyN(wch2, COUNTOF(wch2), pwsz, COUNTOF(wch1)); - if (Encoding_IsANSI(iEncoding)) { + if (Encoding_IsSystemANSI_CP(iEncoding)) { StringCchCatN(wch2, COUNTOF(wch2), wchANSI, COUNTOF(wchANSI)); - } else if (Encoding_IsOEM(iEncoding)) { + } else if (Encoding_IsSystemOEM(iEncoding)) { StringCchCatN(wch2, COUNTOF(wch2), wchOEM, COUNTOF(wchOEM)); } @@ -394,9 +394,9 @@ void Encoding_AddToListView(HWND hwnd, cpi_enc_t idSel, bool bRecodeOnly) StringCchCopyN(wchBuf, COUNTOF(wchBuf), pEE[i].wch, COUNTOF(wchBuf)); } - if (Encoding_IsANSI(id)) { + if (Encoding_IsSystemANSI_CP(id)) { StringCchCatN(wchBuf, COUNTOF(wchBuf), wchANSI, COUNTOF(wchANSI)); - } else if (Encoding_IsOEM(id)) { + } else if (Encoding_IsSystemOEM(id)) { StringCchCatN(wchBuf, COUNTOF(wchBuf), wchOEM, COUNTOF(wchOEM)); } @@ -483,7 +483,7 @@ void Encoding_AddToComboboxEx(HWND hwnd, cpi_enc_t idSel, bool bRecodeOnly) StringCchCopyN(wchBuf, COUNTOF(wchBuf), pEE[i].wch, COUNTOF(wchBuf)); } - if (Encoding_IsANSI(id)) { + if (Encoding_IsSystemANSI_CP(id)) { StringCchCatN(wchBuf, COUNTOF(wchBuf), wchANSI, COUNTOF(wchANSI)); } else if (id == CPI_OEM) { StringCchCatN(wchBuf, COUNTOF(wchBuf), wchOEM, COUNTOF(wchOEM)); @@ -530,121 +530,121 @@ UINT Encoding_GetCodePage(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? g_Encodings[iEncoding].uCodePage : CP_ACP; } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_IsDefault(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_DEFAULT) != 0) : (iEncoding == CPI_ASCII_7BIT); } -// ============================================================================ +// ---------------------------------------------------------------------------- -bool Encoding_IsASCII(const cpi_enc_t iEncoding) +bool Encoding_HasASCII7Bit(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_ASCII_7BIT) != 0) : (iEncoding == CPI_ASCII_7BIT); } -// ============================================================================ +// ---------------------------------------------------------------------------- -bool Encoding_IsANSI(const cpi_enc_t iEncoding) +bool Encoding_IsSystemANSI_CP(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_ANSI) != 0) : (iEncoding == CPI_ASCII_7BIT); } -// ============================================================================ +// ---------------------------------------------------------------------------- -bool Encoding_IsOEM(const cpi_enc_t iEncoding) +bool Encoding_IsSystemOEM(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_OEM) != 0) : (iEncoding == CPI_ASCII_7BIT); } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_MaybeUTF8(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_UTF8) != 0) : (iEncoding == CPI_ASCII_7BIT); } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_IsUTF8_SIGN(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_UTF8_SIGN) != 0) : false; } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_MaybeUTF8_NO_SIGN(const cpi_enc_t iEncoding) { return (Encoding_MaybeUTF8(iEncoding) && !Encoding_IsUTF8_SIGN(iEncoding)); } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_IsMBCS(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_MBCS) != 0) : false; } -// ============================================================================ - -bool Encoding_IsCJK(const cpi_enc_t iEncoding) -{ - UINT const codePage = Encoding_GetCodePage(iEncoding); - switch (codePage) { - case 932: - case 936: - case 949: - case 950: - case 951: - case 1361: - case 10001: - case 10002: - case 10003: - case 10008: - case 20000: - case 20932: - case 20936: - case 50220: - case 50225: - case 51949: - case 52936: - case 54936: - return true; - default: - break; - } - return false; -} -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_IsUNICODE(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_UNICODE) != 0) : false; } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_IsUNICODE_BOM(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_UNICODE_BOM) != 0) : false; } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_IsUNICODE_REVERSE(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_UNICODE_REVERSE) != 0) : false; } -// ============================================================================ - +// ---------------------------------------------------------------------------- bool Encoding_IsINTERNAL(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_INTERNAL) != 0) : false; } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_IsEXTERNAL_8BIT(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_EXTERNAL_8BIT) != 0) : false; } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Encoding_IsRECODE(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? ((g_Encodings[iEncoding].uFlags & NCP_RECODE) != 0) : false; } +// ---------------------------------------------------------------------------- + +bool Encoding_IsCJK(const cpi_enc_t iEncoding) +{ + UINT const codePage = Encoding_GetCodePage(iEncoding); + switch (codePage) { + case 932: + case 936: + case 949: + case 950: + case 951: + case 1361: + case 10001: + case 10002: + case 10003: + case 10008: + case 20000: + case 20932: + case 20936: + case 50220: + case 50225: + case 51949: + case 52936: + case 54936: + return true; + default: + break; + } + return false; +} +// ============================================================================ // ============================================================================ @@ -654,21 +654,21 @@ void Encoding_SetDefaultFlag(const cpi_enc_t iEncoding) g_Encodings[iEncoding].uFlags |= NCP_DEFAULT; } } -// ============================================================================ +// ---------------------------------------------------------------------------- const WCHAR* Encoding_GetLabel(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? g_Encodings[iEncoding].wchLabel : NULL; } -// ============================================================================ +// ---------------------------------------------------------------------------- const char* Encoding_GetParseNames(const cpi_enc_t iEncoding) { return (iEncoding >= 0) ? g_Encodings[iEncoding].pszParseNames : NULL; } -// ============================================================================ +// ---------------------------------------------------------------------------- int Encoding_GetNameA(const cpi_enc_t iEncoding, char* buffer, size_t cch) @@ -686,7 +686,7 @@ int Encoding_GetNameA(const cpi_enc_t iEncoding, char* buffer, size_t cch) } return 0; } -// ============================================================================ +// ---------------------------------------------------------------------------- int Encoding_GetNameW(const cpi_enc_t iEncoding, LPWSTR buffer, size_t cwch) @@ -695,7 +695,7 @@ int Encoding_GetNameW(const cpi_enc_t iEncoding, LPWSTR buffer, size_t cwch) Encoding_GetNameA(iEncoding, tmpbuffer, 256); return (int)MultiByteToWideCharEx(Encoding_SciCP, 0, tmpbuffer, -1, buffer, cwch); } -// ============================================================================ +// ---------------------------------------------------------------------------- bool Has_UTF32_LE_BOM(const char* pBuf, size_t cnt) diff --git a/src/Encoding.h b/src/Encoding.h index 6eec7f73d..435f697ff 100644 --- a/src/Encoding.h +++ b/src/Encoding.h @@ -93,20 +93,20 @@ bool Encoding_GetFromComboboxEx(HWND hwnd, cpi_enc_t* pidEncoding); UINT Encoding_GetCodePage(const cpi_enc_t iEncoding); bool Encoding_IsDefault(const cpi_enc_t iEncoding); -bool Encoding_IsASCII(const cpi_enc_t iEncoding); -bool Encoding_IsANSI(const cpi_enc_t iEncoding); -bool Encoding_IsOEM(const cpi_enc_t iEncoding); +bool Encoding_HasASCII7Bit(const cpi_enc_t iEncoding); +bool Encoding_IsSystemANSI_CP(const cpi_enc_t iEncoding); +bool Encoding_IsSystemOEM(const cpi_enc_t iEncoding); bool Encoding_MaybeUTF8(const cpi_enc_t iEncoding); bool Encoding_IsUTF8_SIGN(const cpi_enc_t iEncoding); bool Encoding_MaybeUTF8_NO_SIGN(const cpi_enc_t iEncoding); bool Encoding_IsMBCS(const cpi_enc_t iEncoding); -bool Encoding_IsCJK(const cpi_enc_t iEncoding); bool Encoding_IsUNICODE(const cpi_enc_t iEncoding); bool Encoding_IsUNICODE_BOM(const cpi_enc_t iEncoding); bool Encoding_IsUNICODE_REVERSE(const cpi_enc_t iEncoding); bool Encoding_IsINTERNAL(const cpi_enc_t iEncoding); bool Encoding_IsEXTERNAL_8BIT(const cpi_enc_t iEncoding); bool Encoding_IsRECODE(const cpi_enc_t iEncoding); +bool Encoding_IsCJK(const cpi_enc_t iEncoding); // Scintilla related #define Encoding_SciCP CP_UTF8 diff --git a/src/EncodingDetection.cpp b/src/EncodingDetection.cpp index 188aebfd8..1adfe4202 100644 --- a/src/EncodingDetection.cpp +++ b/src/EncodingDetection.cpp @@ -877,14 +877,13 @@ static void _SetEncodingTitleInfo(const ENC_DET_T* pEncDetInfo) StringCchPrintf(tmpBuf, COUNTOF(tmpBuf), L"' Conf=%.1f%%", confPercent); StringCchCat(wchEncodingInfo, COUNTOF(wchEncodingInfo), tmpBuf); - double const threshPercent = (double)(Settings2.AnalyzeReliableConfidenceLevel * 100.0f); + double const threshPercent = (double)Settings.AnalyzeReliableConfidenceLevel; const WCHAR* rel_fmt = (confPercent >= threshPercent) ? L" (reliable (%.1f%%))" : L" (NOT reliable (%.1f%%))"; StringCchPrintf(tmpBuf, COUNTOF(tmpBuf), rel_fmt, threshPercent); StringCchCat(wchEncodingInfo, COUNTOF(wchEncodingInfo), tmpBuf); - const WCHAR* const validUTF8 = (pEncDetInfo->bValidUTF8) ? L" [Valid UTF-8]" : L" [Invalid UTF-8]"; + const WCHAR* const validUTF8 = (pEncDetInfo->bValidUTF8) ? (pEncDetInfo->bPureASCII7Bit ? L" [ASCII 7-bit]" : L" [Valid UTF-8]") : L" [Invalid UTF-8]"; StringCchCat(wchEncodingInfo, COUNTOF(wchEncodingInfo), validUTF8); - } @@ -1185,6 +1184,26 @@ extern "C" cpi_enc_t FileVars_GetEncoding(LPFILEVARS lpfv) //============================================================================= //============================================================================= +__forceinline static cpi_enc_t _SetAnsiDefaultEncoding(const ENC_DET_T* const encDetRes) +{ + // Pure ASCII (7-bit) - use UTF-8 if configured, otherwise ANSI default + if (Settings.LoadASCIIasUTF8 && encDetRes->bPureASCII7Bit) { + return CPI_UTF8; + } + if (Encoding_IsValid(Settings.DefaultEncoding)) { + if (Settings.DefaultEncoding == CPI_UTF8) { + if (encDetRes->bValidUTF8) { + return Settings.DefaultEncoding; + } + } + else if (Encoding_IsEXTERNAL_8BIT(Settings.DefaultEncoding)) { + return Settings.DefaultEncoding; + } + } + return CPI_ANSI_DEFAULT; +} + + static void _SetResultingEncoding(ENC_DET_T* encDetRes, bool bBOM_LE, bool bBOM_BE, size_t data_len) { if (encDetRes->bIsUTF8Sig) { @@ -1197,59 +1216,54 @@ static void _SetResultingEncoding(ENC_DET_T* encDetRes, bool bBOM_LE, bool bBOM_ else if (Encoding_IsValid(encDetRes->analyzedEncoding) && (encDetRes->bIsAnalysisReliable || !Settings.UseReliableCEDonly)) { // Valid UTF-8 byte sequence (no null bytes) prefer UTF-8 over // analyzed encoding. ASCII-only files are also valid UTF-8. - if ((encDetRes->bValidUTF8) && (encDetRes->confidence < MIN_CONFIDENCE_ANSI_NOT_UTF8)) + if ((encDetRes->bValidUTF8) && (encDetRes->confidence < MIN_CONFIDENCE_ANSI_NOT_UTF8)) { encDetRes->Encoding = CPI_UTF8; - else + } + else { encDetRes->Encoding = encDetRes->analyzedEncoding; + } } else if (Encoding_IsUNICODE(encDetRes->unicodeAnalysis) && (!(data_len & 1) || encDetRes->bHasBOM)) { // unicodeAnalysis confirms Unicode structure. // Only prefer analyzedEncoding if it's also Unicode (e.g., UCHARDET // identified specific UTF-16 variant). Otherwise use unicodeAnalysis. - if (Encoding_IsValid(encDetRes->analyzedEncoding) && Encoding_IsUNICODE(encDetRes->analyzedEncoding)) + if (Encoding_IsValid(encDetRes->analyzedEncoding) && Encoding_IsUNICODE(encDetRes->analyzedEncoding)) { encDetRes->Encoding = encDetRes->analyzedEncoding; - else + } + else { encDetRes->Encoding = encDetRes->unicodeAnalysis; + } } - else if (encDetRes->bValidUTF8 && !encDetRes->bPureASCII7Bit) { - // Non-ASCII data where all bytes form valid UTF-8 multi-byte sequences. - // When UCHARDET was skipped or returned unreliable results, valid - // multi-byte UTF-8 is a strong structural signal — prefer UTF-8 over - // blind ANSI fallback. - encDetRes->Encoding = CPI_UTF8; - } - else if (encDetRes->bPureASCII7Bit) { - // pure ASCII (no null bytes, all 0x01-0x7F) — treat as UTF-8 or ANSI - // depending on user preference - encDetRes->Encoding = Settings.LoadASCIIasUTF8 ? CPI_UTF8 : CPI_ANSI_DEFAULT; - } - else if (encDetRes->bHasNullBytes) { - // Data contains null bytes — not a valid single-byte encoding. - // Both Unicode detectors (IsTextUnicode and null-distribution) already - // rejected this data at earlier branches, so treat as binary via ANSI - // codepage (same as UTF-32 handling). - encDetRes->Encoding = CPI_ANSI_DEFAULT; - } - else { - cpi_enc_t const weak = Encoding_SrcWeak(CPI_GET); - if (Encoding_IsValid(weak)) { - if ((weak == CPI_UTF8) && encDetRes->bValidUTF8) { - // weak UTF-8 hint and data is valid UTF-8 - use weak hint - encDetRes->Encoding = weak; - } - else if (Encoding_IsANSI(weak)) { - encDetRes->Encoding = weak; + + // Non-ASCII data where all bytes form valid UTF-8 multi-byte sequences. + // When UCHARDET was skipped or returned unreliable results, valid + // multi-byte UTF-8 is a strong structural signal — prefer UTF-8 over + // blind ANSI fallback. + if (Encoding_IsNONE(encDetRes->Encoding)) + { + if (Settings.UseDefaultForFileEncoding) { + encDetRes->Encoding = _SetAnsiDefaultEncoding(encDetRes); + } + else if (encDetRes->bValidUTF8 || (encDetRes->bPureASCII7Bit && Settings.LoadASCIIasUTF8)) + // pure ASCII (no null bytes, all 0x01-0x7F) — treat as UTF-8 or ANSI + encDetRes->Encoding = CPI_UTF8; + else { + cpi_enc_t const weak = Encoding_SrcWeak(CPI_GET); + if (Encoding_IsValid(weak)) { + if ((weak == CPI_UTF8) && encDetRes->bValidUTF8) { + // weak UTF-8 hint and data is valid UTF-8 - use weak hint + encDetRes->Encoding = weak; + } + else if (Encoding_IsEXTERNAL_8BIT(weak)) { + encDetRes->Encoding = weak; + } } } } - // Final fallback: use preferred encoding if configured, otherwise system ANSI codepage + // Final fallback / last resort: if still no encoding, but valid UTF-8, use UTF-8. if (Encoding_IsNONE(encDetRes->Encoding)) { - if (Settings.UseDefaultForFileEncoding && Encoding_IsValid(Settings.DefaultEncoding)) { - encDetRes->Encoding = Settings.DefaultEncoding; - } else { - encDetRes->Encoding = CPI_ANSI_DEFAULT; - } + encDetRes->Encoding = (encDetRes->bValidUTF8) ? CPI_UTF8 : CPI_ANSI_DEFAULT; } } @@ -1376,7 +1390,7 @@ extern "C" ENC_DET_T Encoding_DetectEncoding(const HPATHL hpath, // --- choose best encoding guess ---- // -------------------------------------------------------------------------- - encDetRes.bIsAnalysisReliable = (encDetRes.confidence >= Settings2.AnalyzeReliableConfidenceLevel); + encDetRes.bIsAnalysisReliable = (encDetRes.confidence >= ((float)Settings.AnalyzeReliableConfidenceLevel / 100.0f)); // init resulting encoding encDetRes.Encoding = CPI_NONE; diff --git a/src/Notepad3.c b/src/Notepad3.c index 380a7ff7c..93ac85f32 100644 --- a/src/Notepad3.c +++ b/src/Notepad3.c @@ -4339,7 +4339,7 @@ LRESULT MsgInitMenu(HWND hwnd, WPARAM wParam, LPARAM lParam) i = IDM_ENCODING_UTF8SIGN; } else if (Encoding_MaybeUTF8(Encoding_GetCurrent())) { i = IDM_ENCODING_UTF8; - } else if (Encoding_IsANSI(Encoding_GetCurrent())) { + } else if (Encoding_IsSystemANSI_CP(Encoding_GetCurrent())) { i = IDM_ENCODING_ANSI; } else { i = -1; diff --git a/src/TypeDefs.h b/src/TypeDefs.h index f524a6a67..6c00c077f 100644 --- a/src/TypeDefs.h +++ b/src/TypeDefs.h @@ -640,6 +640,7 @@ typedef struct SETTINGS_T { bool NoEncodingTags; bool SkipUnicodeDetection; bool SkipANSICodePageDetection; + int AnalyzeReliableConfidenceLevel; int DefaultEOLMode; bool WarnInconsistEOLs; bool FixLineEndings; @@ -789,7 +790,6 @@ typedef struct SETTINGS2_T { int DarkModeHiglightContrast; int UchardetLanguageFilter; - float AnalyzeReliableConfidenceLevel; float LocaleAnsiCodePageAnalysisBonus; #ifdef D_NP3_WIN10_DARK_MODE