Merge pull request #5619 from RaiKoHoff/Dev_Master

fix: default encoding (forced fallback)
This commit is contained in:
Rainer Kottenhoff 2026-03-29 17:06:59 +02:00 committed by GitHub
commit e3fe30cca4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
37 changed files with 239 additions and 145 deletions

View File

@ -3,6 +3,7 @@
;Notepad3.ini=%APPDATA%\Rizonesoft\Notepad3\Notepad3.ini
[Settings]
SettingsVersion=5
;AnalyzeReliableConfidenceLevel=50
[Settings2]
;IMEInteraction=0
;DateTimeFormat= ;(-> <Locale dependent short format>)
@ -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:

View File

@ -28,6 +28,10 @@ These settings are managed through Notepad3's user interface (Menu → Settings)
#### `Favorites=%APPDATA%\Rizonesoft\Notepad3\Favorites\`
#### `AnalyzeReliableConfidenceLevel=50`
Confidence threshold (0100) 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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
//

View File

@ -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 @@ CASE_WM_CTLCOLOR_SET:
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 @@ CASE_WM_CTLCOLOR_SET:
}
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 @@ CASE_WM_CTLCOLOR_SET:
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 {

View File

@ -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;
}

View File

@ -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,55 +530,91 @@ 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_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)
{
@ -609,42 +645,6 @@ bool Encoding_IsCJK(const cpi_enc_t iEncoding)
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;
}
// ============================================================================
@ -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)

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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