OSDN Git Service

Retry to detect the encoding of a file using all content when occurred encoding error...
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 4 Dec 2016 07:37:19 +0000 (16:37 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Sun, 4 Dec 2016 07:37:19 +0000 (16:37 +0900)
Src/MergeDoc.cpp
Src/codepage_detect.cpp
Src/codepage_detect.h

index 63c22bc..3e8ac57 100644 (file)
@@ -2469,6 +2469,12 @@ DWORD CMergeDoc::LoadOneFile(int index, String filename, bool readOnly, const St
                m_pRescanFileInfo[index]->Update(filename);
 
                loadSuccess = LoadFile(filename.c_str(), index, readOnly, encoding);
+               if (FileLoadResult::IsLossy(loadSuccess))
+               {
+                       m_ptBuf[index]->FreeAll();
+                       loadSuccess = LoadFile(filename.c_str(), index, readOnly,
+                               GuessCodepageEncoding(filename, GetOptionsMgr()->GetInt(OPT_CP_DETECT), -1));
+               }
        }
        else
        {
index 35668ba..338fafd 100644 (file)
@@ -25,9 +25,6 @@
 #  define strncasecmp(a, b, n) _strnicmp((a), (b), (n))
 #endif
 
-/** @brief Buffer size used in this file. */
-static const int BufSize = 65536;
-
 /**
  * @brief Prefixes to handle when searching for codepage names
  * NB: prefixes ending in '-' must go first!
@@ -211,8 +208,6 @@ static unsigned GuessEncoding_from_bytes(const String& ext, const char *src, siz
        }
        if (guessEncodingType & 1)
        {
-               if (len > BufSize)
-                       len = BufSize;
                String lower_ext = string_makelower(ext);
                if (lower_ext == _T(".rc"))
                {
@@ -236,10 +231,9 @@ static unsigned GuessEncoding_from_bytes(const String& ext, const char *src, siz
  * @param [in] bGuessEncoding Try to guess codepage (not just unicode encoding).
  * @return Structure getting the encoding info.
  */
-FileTextEncoding GuessCodepageEncoding(const String& filepath, int guessEncodingType)
+FileTextEncoding GuessCodepageEncoding(const String& filepath, int guessEncodingType, int mapmaxlen)
 {
        FileTextEncoding encoding;
-       const int mapmaxlen = BufSize;
        CMarkdown::FileImage fi(filepath.c_str(), mapmaxlen);
        encoding.SetCodepage(ucr::getDefaultCodepage());
        encoding.m_bom = false;
index 2f5f67f..19dbda6 100644 (file)
@@ -8,4 +8,7 @@
 #include "UnicodeString.h"
 #include "FileTextEncoding.h"
 
-FileTextEncoding GuessCodepageEncoding(const String& filepath, int guessEncodingType);
+/** @brief Buffer size used in this file. */
+static const int BufSize = 65536;
+
+FileTextEncoding GuessCodepageEncoding(const String& filepath, int guessEncodingType, int mapmaxlen = BufSize);