+ fix: use Windows regional ANSI Code Page settings for fallback in case of file encoding detection failure (instead of default encoding for created files)

This commit is contained in:
Rainer Kottenhoff 2018-03-01 12:11:43 +01:00
parent 528d0fa3bf
commit cce69112ca
6 changed files with 54 additions and 48 deletions

View File

@ -55,6 +55,7 @@ extern WCHAR g_wchCurFile[];
extern WCHAR g_wchAppUserModelID[];
extern DWORD dwLastIOError;
extern BOOL bUseDefaultForFileEncoding;
extern BOOL bSkipUnicodeDetection;
extern BOOL bLoadASCIIasUTF8;
extern BOOL bLoadNFOasOEM;
@ -2094,6 +2095,9 @@ INT_PTR CALLBACK SelectDefEncodingDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPAR
Encoding_AddToComboboxEx(GetDlgItem(hwnd,IDC_ENCODINGLIST),pdd->idEncoding,0);
if (bUseDefaultForFileEncoding)
CheckDlgButton(hwnd, IDC_USEASREADINGFALLBACK, BST_CHECKED);
if (bSkipUnicodeDetection)
CheckDlgButton(hwnd,IDC_NOUNICODEDETECTION,BST_CHECKED);
@ -2121,6 +2125,7 @@ INT_PTR CALLBACK SelectDefEncodingDlgProc(HWND hwnd,UINT umsg,WPARAM wParam,LPAR
EndDialog(hwnd,IDCANCEL);
}
else {
bUseDefaultForFileEncoding = (IsDlgButtonChecked(hwnd, IDC_USEASREADINGFALLBACK) == BST_CHECKED) ? 1 : 0;
bSkipUnicodeDetection = (IsDlgButtonChecked(hwnd,IDC_NOUNICODEDETECTION) == BST_CHECKED) ? 1 : 0;
bLoadASCIIasUTF8 = (IsDlgButtonChecked(hwnd,IDC_ASCIIASUTF8) == BST_CHECKED) ? 1 : 0;
bLoadNFOasOEM = (IsDlgButtonChecked(hwnd,IDC_NFOASOEM) == BST_CHECKED) ? 1 : 0;

View File

@ -64,6 +64,7 @@ extern DWORD dwLastIOError;
extern UINT cpLastFind;
extern BOOL bReplaceInitialized;
extern BOOL bUseOldStyleBraceMatching;
extern BOOL bUseDefaultForFileEncoding;
extern BOOL bSkipUnicodeDetection;
extern BOOL bFindReplCopySelOrClip;
@ -81,7 +82,7 @@ extern BOOL bFixLineEndings;
extern BOOL bAutoStripBlanks;
// Default Codepage and Character Set
extern int g_iDefaultEncoding;
extern int g_iDefaultNewFileEncoding;
extern int g_iDefaultCharSet;
extern BOOL bLoadASCIIasUTF8;
extern BOOL bLoadNFOasOEM;
@ -193,8 +194,8 @@ HWND EditCreate(HWND hwndParent)
g_hInstance,
NULL);
Encoding_Current(g_iDefaultEncoding);
Encoding_SciSetCodePage(hwnd,g_iDefaultEncoding);
Encoding_Current(g_iDefaultNewFileEncoding);
Encoding_SciSetCodePage(hwnd,g_iDefaultNewFileEncoding);
SendMessage(hwnd,SCI_SETEOLMODE,SC_EOL_CRLF,0);
SendMessage(hwnd,SCI_SETPASTECONVERTENDINGS,TRUE,0);
SendMessage(hwnd,SCI_SETMODEVENTMASK,/*SC_MODEVENTMASKALL*/SC_MOD_INSERTTEXT|SC_MOD_DELETETEXT|SC_MOD_CONTAINER,0);
@ -1061,9 +1062,9 @@ BOOL EditLoadFile(
}
const int iFileEncoding = Encoding_SrcCmdLn(CPI_GET);
const int iPreferedEncoding = (bPreferOEM) ? g_DOSEncoding :
(Encoding_IsValid(Encoding_SrcWeak(CPI_GET)) ? Encoding_SrcWeak(CPI_GET) : g_iDefaultEncoding);
const int iFileEncWeak = (Encoding_SrcWeak(CPI_GET) != CPI_NONE) ? Encoding_SrcWeak(CPI_GET) : CPI_ANSI_DEFAULT;
const int iPreferedEncoding = (bPreferOEM) ? g_DOSEncoding : (bUseDefaultForFileEncoding ? g_iDefaultNewFileEncoding : iFileEncWeak);
//@@@(g_Encodings[iFileEncWeak].uFlags & NCP_INTERNAL) ? g_iDefaultNewFileEncoding : iFileEncWeak;
BOOL bBOM = FALSE;
BOOL bReverse = FALSE;
@ -1176,6 +1177,7 @@ BOOL EditLoadFile(
}
else {
if (iFileEncoding != CPI_NONE)
*iEncoding = iFileEncoding;
else {
@ -1184,16 +1186,7 @@ BOOL EditLoadFile(
if (fvCurFile.mask & FV_ENCODING)
*iEncoding = CPI_ANSI_DEFAULT;
else {
int iEncWeak = Encoding_SrcWeak(CPI_GET);
switch (iEncWeak) {
case CPI_NONE:
*iEncoding = iPreferedEncoding;
break;
default:
*iEncoding = (g_Encodings[iEncWeak].uFlags & NCP_INTERNAL) ? g_iDefaultEncoding :
(Encoding_IsValid(iEncWeak) ? iEncWeak : iPreferedEncoding);
break;
}
*iEncoding = iPreferedEncoding;
}
}
}
@ -1236,7 +1229,7 @@ BOOL EditLoadFile(
}
}
else {
*iEncoding = Encoding_IsValid(iFileEncoding) ? iFileEncoding : g_iDefaultEncoding;
*iEncoding = Encoding_IsValid(iFileEncoding) ? iFileEncoding : iPreferedEncoding;
Encoding_SciSetCodePage(hwnd,*iEncoding);
EditSetNewText(hwnd,"",0);
EditSetNewText(hwnd,lpData,cbData);

View File

@ -42,8 +42,6 @@
extern HINSTANCE g_hInstance;
extern BOOL bSkipUnicodeDetection;
extern BOOL bPreserveCaretPos;
//=============================================================================
@ -1824,6 +1822,8 @@ UINT CharSetFromCodePage(UINT uCodePage) {
}
extern BOOL bPreserveCaretPos;
//=============================================================================
//
// MRU functions
@ -3405,6 +3405,7 @@ void Encoding_SciSetCodePage(HWND hwnd,int iEncoding) {
*/
}
extern BOOL bSkipUnicodeDetection;
BOOL IsUnicode(const char* pBuffer,int cb,LPBOOL lpbBOM,LPBOOL lpbReverse) {
int i = 0xFFFF;

View File

@ -174,6 +174,7 @@ BOOL g_bCodeFoldingAvailable;
BOOL g_bShowCodeFolding;
BOOL bViewWhiteSpace;
BOOL bViewEOLs;
BOOL bUseDefaultForFileEncoding;
BOOL bSkipUnicodeDetection;
BOOL bLoadASCIIasUTF8;
BOOL bLoadNFOasOEM;
@ -254,7 +255,7 @@ LPMRULIST mruReplace;
DWORD dwLastIOError;
int g_iDefaultEncoding;
int g_iDefaultNewFileEncoding;
int g_iDefaultCharSet;
int g_iEOLMode;
@ -2731,7 +2732,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
case IDM_ENCODING_SETDEFAULT:
SelectDefEncodingDlg(hwnd,&g_iDefaultEncoding);
SelectDefEncodingDlg(hwnd,&g_iDefaultNewFileEncoding);
break;
@ -4466,7 +4467,7 @@ LRESULT MsgCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
WCHAR tchCurFile2[MAX_PATH] = { L'\0' };
if (StringCchLenW(g_wchCurFile,COUNTOF(g_wchCurFile))) {
Encoding_SrcCmdLn(Encoding_MapUnicode(g_iDefaultEncoding));
Encoding_SrcCmdLn(Encoding_MapUnicode(g_iDefaultNewFileEncoding));
StringCchCopy(tchCurFile2,COUNTOF(tchCurFile2),g_wchCurFile);
FileLoad(FALSE,FALSE,TRUE,TRUE,tchCurFile2);
}
@ -5796,10 +5797,12 @@ void LoadSettings()
bViewEOLs = IniSectionGetBool(pIniSection,L"ViewEOLs", FALSE);
g_iDefaultEncoding = IniSectionGetInt(pIniSection,L"DefaultEncoding", CPI_NONE);
g_iDefaultNewFileEncoding = IniSectionGetInt(pIniSection,L"DefaultEncoding", CPI_NONE);
// if DefaultEncoding is not defined set to system's current code-page
g_iDefaultEncoding = (g_iDefaultEncoding == CPI_NONE) ?
Encoding_MapIniSetting(TRUE,(int)GetACP()) : Encoding_MapIniSetting(TRUE,g_iDefaultEncoding);
g_iDefaultNewFileEncoding = (g_iDefaultNewFileEncoding == CPI_NONE) ?
Encoding_MapIniSetting(TRUE,(int)GetACP()) : Encoding_MapIniSetting(TRUE,g_iDefaultNewFileEncoding);
bUseDefaultForFileEncoding = IniSectionGetBool(pIniSection, L"UseDefaultForFileEncoding", FALSE);
bSkipUnicodeDetection = IniSectionGetBool(pIniSection, L"SkipUnicodeDetection", FALSE);
@ -6003,19 +6006,19 @@ void LoadSettings()
// remove internal support for Chinese, Japan, Korean DBCS use UTF-8 instead
/*
if (g_iDefaultEncoding == CPI_ANSI_DEFAULT)
if (g_iDefaultNewFileEncoding == CPI_ANSI_DEFAULT)
{
// check for Chinese, Japan, Korean DBCS code pages and switch accordingly
int acp = (int)GetACP();
if (acp == 932 || acp == 936 || acp == 949 || acp == 950) {
iSciDefaultCodePage = acp;
}
g_iDefaultEncoding = Encoding_GetByCodePage(iSciDefaultCodePage);
g_iDefaultNewFileEncoding = Encoding_GetByCodePage(iSciDefaultCodePage);
}
*/
// set flag for encoding default
g_Encodings[g_iDefaultEncoding].uFlags |= NCP_DEFAULT;
g_Encodings[g_iDefaultNewFileEncoding].uFlags |= NCP_DEFAULT;
// define default charset
g_iDefaultCharSet = (int)CharSetFromCodePage((UINT)iSciDefaultCodePage);
@ -6101,7 +6104,8 @@ void SaveSettings(BOOL bSaveSettingsNow) {
IniSectionSetBool(pIniSection, L"MarkOccurrencesCurrentWord", bMarkOccurrencesCurrentWord);
IniSectionSetBool(pIniSection, L"ViewWhiteSpace", bViewWhiteSpace);
IniSectionSetBool(pIniSection, L"ViewEOLs", bViewEOLs);
IniSectionSetInt(pIniSection, L"DefaultEncoding", Encoding_MapIniSetting(FALSE, g_iDefaultEncoding));
IniSectionSetInt(pIniSection, L"DefaultEncoding", Encoding_MapIniSetting(FALSE, g_iDefaultNewFileEncoding));
IniSectionSetBool(pIniSection, L"UseDefaultForFileEncoding", bUseDefaultForFileEncoding);
IniSectionSetBool(pIniSection, L"SkipUnicodeDetection", bSkipUnicodeDetection);
IniSectionSetInt(pIniSection, L"LoadASCIIasUTF8", bLoadASCIIasUTF8);
IniSectionSetBool(pIniSection, L"LoadNFOasOEM", bLoadNFOasOEM);
@ -7435,9 +7439,9 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp
g_iEOLMode = iLineEndings[g_iDefaultEOLMode];
SendMessage(g_hwndEdit,SCI_SETEOLMODE,iLineEndings[g_iDefaultEOLMode],0);
Encoding_Current(g_iDefaultEncoding);
Encoding_HasChanged(g_iDefaultEncoding);
Encoding_SciSetCodePage(g_hwndEdit,g_iDefaultEncoding);
Encoding_Current(g_iDefaultNewFileEncoding);
Encoding_HasChanged(g_iDefaultNewFileEncoding);
Encoding_SciSetCodePage(g_hwndEdit,g_iDefaultNewFileEncoding);
EditSetNewText(g_hwndEdit,"",0);
bReadOnly = FALSE;
@ -7511,8 +7515,8 @@ BOOL FileLoad(BOOL bDontSave,BOOL bNew,BOOL bReload,BOOL bNoEncDetect,LPCWSTR lp
Encoding_HasChanged(fileEncoding);
}
else {
Encoding_Current(g_iDefaultEncoding);
Encoding_HasChanged(g_iDefaultEncoding);
Encoding_Current(g_iDefaultNewFileEncoding);
Encoding_HasChanged(g_iDefaultNewFileEncoding);
}
Encoding_SciSetCodePage(g_hwndEdit,Encoding_Current(CPI_GET));
bReadOnly = FALSE;

View File

@ -25,10 +25,10 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_RUN ICON "..\\res\\Run.ico"
IDR_MAINWND ICON "..\\res\\Notepad3.ico"
IDI_RUN ICON "..\\res\\Run.ico"
IDR_MAINWND128 ICON "..\\res\\Notepad3_128.ico"
IDI_STYLES ICON "..\\res\\Styles.ico"
@ -486,7 +486,7 @@ BEGIN
"M", IDM_VIEW_MARGIN, VIRTKEY, SHIFT, CONTROL, NOINVERT
"N", IDM_FILE_NEW, VIRTKEY, CONTROL, NOINVERT
"N", IDM_FILE_NEWWINDOW, VIRTKEY, ALT, NOINVERT
"N", IDM_FILE_NEWWINDOW2, VIRTKEY, ALT, SHIFT, NOINVERT
"N", IDM_FILE_NEWWINDOW2, VIRTKEY, SHIFT, ALT, NOINVERT
"N", IDM_VIEW_LINENUMBERS, VIRTKEY, SHIFT, CONTROL, NOINVERT
"O", IDM_FILE_OPEN, VIRTKEY, CONTROL, NOINVERT
"O", IDM_EDIT_SORTLINES, VIRTKEY, ALT, NOINVERT
@ -744,23 +744,25 @@ BEGIN
SCROLLBAR IDC_RESIZEGRIP3,7,112,10,10
END
IDD_DEFENCODING DIALOGEX 0, 0, 180, 118
IDD_DEFENCODING DIALOGEX 0, 0, 181, 122
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Encoding"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
LTEXT "&Default encoding:",IDC_STATIC,7,7,58,8
CONTROL "",IDC_ENCODINGLIST,"ComboBoxEx32",CBS_DROPDOWNLIST | WS_CLIPSIBLINGS | WS_VSCROLL | WS_TABSTOP,7,20,166,128
LTEXT "&Default encoding (new file):",IDC_STATIC,7,7,90,8
CONTROL "",IDC_ENCODINGLIST,"ComboBoxEx32",CBS_DROPDOWNLIST | WS_CLIPSIBLINGS | WS_VSCROLL | WS_TABSTOP,7,20,167,128
CONTROL "Fallback on detection failure.", IDC_USEASREADINGFALLBACK,
"Button", BS_AUTOCHECKBOX | WS_TABSTOP, 7, 40, 108, 10
CONTROL "Skip automatic &Unicode detection.",IDC_NOUNICODEDETECTION,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,43,124,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,51,124,10
CONTROL "Open 7-bit &ASCII files in UTF-8 mode.",IDC_ASCIIASUTF8,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,53,136,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,62,136,10
CONTROL "Open 8-bit *.&nfo/diz files in DOS-437 mode.",IDC_NFOASOEM,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,63,166,10
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,73,167,10
CONTROL "Don't parse encoding &tags.",IDC_ENCODINGFROMFILEVARS,
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,73,102,10
DEFPUSHBUTTON "OK",IDOK,68,97,50,14
PUSHBUTTON "Cancel",IDCANCEL,123,97,50,14
"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,84,102,10
DEFPUSHBUTTON "OK",IDOK,68,101,50,14
PUSHBUTTON "Cancel",IDCANCEL,124,101,50,14
END
IDD_DEFEOLMODE DIALOGEX 0, 0, 180, 78
@ -1209,9 +1211,9 @@ BEGIN
IDD_DEFENCODING, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 173
RIGHTMARGIN, 174
TOPMARGIN, 7
BOTTOMMARGIN, 101
BOTTOMMARGIN, 115
END
IDD_DEFEOLMODE, DIALOG

View File

@ -134,6 +134,7 @@
#define IDC_SWAPSTRG 230
#define IDC_CHECK_OCC 231
#define IDC_PRINTER 232
#define IDC_USEASREADINGFALLBACK 233
#define IDACC_FIND 302
#define IDACC_REPLACE 303
#define IDACC_SAVEPOS 304