diff --git a/BUILD.gn b/BUILD.gn
index 70fb380..8cbae65 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -731,6 +731,7 @@
     "core/src/fxcrt/fx_basic_memmgr_unittest.cpp",
     "core/src/fxcrt/fx_basic_wstring_unittest.cpp",
     "core/src/fxcrt/fx_bidi_unittest.cpp",
+    "core/src/fxcrt/fx_extension_unittest.cpp",
     "core/src/fxcrt/fx_system_unittest.cpp",
     "third_party/base/nonstd_unique_ptr_unittest.cpp",
   ]
diff --git a/core/include/fxcrt/fx_ext.h b/core/include/fxcrt/fx_ext.h
index c24955f..f13d37c 100644
--- a/core/include/fxcrt/fx_ext.h
+++ b/core/include/fxcrt/fx_ext.h
@@ -7,11 +7,10 @@
 #ifndef CORE_INCLUDE_FXCRT_FX_EXT_H_
 #define CORE_INCLUDE_FXCRT_FX_EXT_H_
 
-#include "fx_system.h"
+#include <cctype>
+#include <cwctype>
 
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include "fx_system.h"
 
 FX_FLOAT FXSYS_tan(FX_FLOAT a);
 FX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x);
@@ -38,6 +37,25 @@
   return ch < 'a' || ch > 'z' ? ch : (ch - 0x20);
 }
 
+inline int FXSYS_toHexDigit(const FX_CHAR c) {
+  if (!std::isxdigit(c))
+    return 0;
+  char upchar = std::toupper(c);
+  return upchar > '9' ? upchar - 'A' + 10 : upchar - '0';
+}
+
+inline int FXSYS_toDecimalDigit(const FX_CHAR c) {
+  if (!std::isdigit(c))
+    return 0;
+  return c - '0';
+}
+
+inline int FXSYS_toDecimalDigitWide(const FX_WCHAR c) {
+  if (!std::iswdigit(c))
+    return 0;
+  return c - L'0';
+}
+
 FX_DWORD FX_HashCode_String_GetA(const FX_CHAR* pStr,
                                  int32_t iLength,
                                  FX_BOOL bIgnoreCase = FALSE);
@@ -45,13 +63,6 @@
                                  int32_t iLength,
                                  FX_BOOL bIgnoreCase = FALSE);
 
-#ifdef __cplusplus
-}
-#endif
-#ifdef __cplusplus
-extern "C" {
-#endif
-
 void* FX_Random_MT_Start(FX_DWORD dwSeed);
 
 FX_DWORD FX_Random_MT_Generate(void* pContext);
@@ -63,9 +74,7 @@
 void FX_Random_GenerateMT(FX_DWORD* pBuffer, int32_t iCount);
 
 void FX_Random_GenerateCrypto(FX_DWORD* pBuffer, int32_t iCount);
-#ifdef __cplusplus
-}
-#endif
+
 template <class baseType>
 class CFX_SSortTemplate {
  public:
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
index fb0f628..f242aaf 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font.cpp
@@ -11,6 +11,7 @@
 #include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_pageobj.h"
 #include "core/include/fpdfapi/fpdf_resource.h"
+#include "core/include/fxcrt/fx_ext.h"
 #include "core/include/fxge/fx_freetype.h"
 
 FX_BOOL FT_UseTTCharmap(FXFT_Face face, int platform_id, int encoding_id) {
@@ -514,32 +515,19 @@
 FX_DWORD CPDF_ToUnicodeMap::StringToCode(const CFX_ByteStringC& str) {
   const FX_CHAR* buf = str.GetCStr();
   int len = str.GetLength();
-  if (len == 0) {
+  if (len == 0)
     return 0;
-  }
+
   int result = 0;
   if (buf[0] == '<') {
-    for (int i = 1; i < len; i++) {
-      int digit;
-      if (buf[i] >= '0' && buf[i] <= '9') {
-        digit = buf[i] - '0';
-      } else if (buf[i] >= 'a' && buf[i] <= 'f') {
-        digit = buf[i] - 'a' + 10;
-      } else if (buf[i] >= 'A' && buf[i] <= 'F') {
-        digit = buf[i] - 'A' + 10;
-      } else {
-        break;
-      }
-      result = result * 16 + digit;
-    }
+    for (int i = 1; i < len && std::isxdigit(buf[i]); ++i)
+      result = result * 16 + FXSYS_toHexDigit(buf[i]);
     return result;
   }
-  for (int i = 0; i < len; i++) {
-    if (buf[i] < '0' || buf[i] > '9') {
-      break;
-    }
-    result = result * 10 + buf[i] - '0';
-  }
+
+  for (int i = 0; i < len && std::isdigit(buf[i]); ++i)
+    result = result * 10 + FXSYS_toDecimalDigit(buf[i]);
+
   return result;
 }
 static CFX_WideString StringDataAdd(CFX_WideString str) {
@@ -566,26 +554,15 @@
     const CFX_ByteStringC& str) {
   const FX_CHAR* buf = str.GetCStr();
   int len = str.GetLength();
-  if (len == 0) {
+  if (len == 0)
     return CFX_WideString();
-  }
+
   CFX_WideString result;
   if (buf[0] == '<') {
     int byte_pos = 0;
     FX_WCHAR ch = 0;
-    for (int i = 1; i < len; i++) {
-      int digit;
-      if (buf[i] >= '0' && buf[i] <= '9') {
-        digit = buf[i] - '0';
-      } else if (buf[i] >= 'a' && buf[i] <= 'f') {
-        digit = buf[i] - 'a' + 10;
-      } else if (buf[i] >= 'A' && buf[i] <= 'F') {
-        digit = buf[i] - 'A' + 10;
-      } else {
-        break;
-      }
-      ch = ch * 16 + digit;
-
+    for (int i = 1; i < len && std::isxdigit(buf[i]); ++i) {
+      ch = ch * 16 + FXSYS_toHexDigit(buf[i]);
       byte_pos++;
       if (byte_pos == 4) {
         result += ch;
@@ -595,8 +572,6 @@
     }
     return result;
   }
-  if (buf[0] == '(') {
-  }
   return result;
 }
 void CPDF_ToUnicodeMap::Load(CPDF_Stream* pStream) {
diff --git a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
index 1ecb6a6..49883aa 100644
--- a/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
+++ b/core/src/fpdfapi/fpdf_font/fpdf_font_cid.cpp
@@ -10,6 +10,7 @@
 #include "core/include/fpdfapi/fpdf_module.h"
 #include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_resource.h"
+#include "core/include/fxcrt/fx_ext.h"
 #include "core/include/fxge/fx_freetype.h"
 #include "core/include/fxge/fx_ge.h"
 
@@ -699,30 +700,17 @@
   m_LastWord = word;
 }
 
+// Static.
 FX_DWORD CPDF_CMapParser::CMap_GetCode(const CFX_ByteStringC& word) {
   int num = 0;
   if (word.GetAt(0) == '<') {
-    for (int i = 1; i < word.GetLength(); i++) {
-      uint8_t digit = word.GetAt(i);
-      if (digit >= '0' && digit <= '9') {
-        digit = digit - '0';
-      } else if (digit >= 'a' && digit <= 'f') {
-        digit = digit - 'a' + 10;
-      } else if (digit >= 'A' && digit <= 'F') {
-        digit = digit - 'A' + 10;
-      } else {
-        return num;
-      }
-      num = num * 16 + digit;
-    }
-  } else {
-    for (int i = 0; i < word.GetLength(); i++) {
-      if (word.GetAt(i) < '0' || word.GetAt(i) > '9') {
-        return num;
-      }
-      num = num * 10 + word.GetAt(i) - '0';
-    }
+    for (int i = 1; i < word.GetLength() && std::isxdigit(word.GetAt(i)); ++i)
+      num = num * 16 + FXSYS_toHexDigit(word.GetAt(i));
+    return num;
   }
+
+  for (int i = 0; i < word.GetLength() && std::isdigit(word.GetAt(i)); ++i)
+    num = num * 10 + FXSYS_toDecimalDigit(word.GetAt(i));
   return num;
 }
 
@@ -746,13 +734,7 @@
   for (i = 0; i < range.m_CharSize; ++i) {
     uint8_t digit1 = first.GetAt(i * 2 + 1);
     uint8_t digit2 = first.GetAt(i * 2 + 2);
-    uint8_t byte = (digit1 >= '0' && digit1 <= '9')
-                       ? (digit1 - '0')
-                       : ((digit1 & 0xdf) - 'A' + 10);
-    byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9')
-                            ? (digit2 - '0')
-                            : ((digit2 & 0xdf) - 'A' + 10));
-    range.m_Lower[i] = byte;
+    range.m_Lower[i] = FXSYS_toHexDigit(digit1) * 16 + FXSYS_toHexDigit(digit2);
   }
 
   FX_DWORD size = second.GetLength();
@@ -763,13 +745,7 @@
     uint8_t digit2 = ((FX_DWORD)i * 2 + 2 < size)
                          ? second.GetAt((FX_STRSIZE)i * 2 + 2)
                          : '0';
-    uint8_t byte = (digit1 >= '0' && digit1 <= '9')
-                       ? (digit1 - '0')
-                       : ((digit1 & 0xdf) - 'A' + 10);
-    byte = byte * 16 + ((digit2 >= '0' && digit2 <= '9')
-                            ? (digit2 - '0')
-                            : ((digit2 & 0xdf) - 'A' + 10));
-    range.m_Upper[i] = byte;
+    range.m_Upper[i] = FXSYS_toHexDigit(digit1) * 16 + FXSYS_toHexDigit(digit2);
   }
   return true;
 }
diff --git a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
index 0c48b5a..4b95da8 100644
--- a/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
+++ b/core/src/fpdfapi/fpdf_page/fpdf_page_parser_old.cpp
@@ -11,6 +11,7 @@
 #include "core/include/fpdfapi/fpdf_module.h"
 #include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fxcodec/fx_codec.h"
+#include "core/include/fxcrt/fx_ext.h"
 
 namespace {
 
@@ -790,7 +791,7 @@
         break;
       case 1:
         if (ch >= '0' && ch <= '7') {
-          iEscCode = ch - '0';
+          iEscCode = FXSYS_toDecimalDigit(ch);
           status = 2;
           break;
         }
@@ -815,7 +816,7 @@
         break;
       case 2:
         if (ch >= '0' && ch <= '7') {
-          iEscCode = iEscCode * 8 + ch - '0';
+          iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
           status = 3;
         } else {
           buf.AppendChar(iEscCode);
@@ -825,7 +826,7 @@
         break;
       case 3:
         if (ch >= '0' && ch <= '7') {
-          iEscCode = iEscCode * 8 + ch - '0';
+          iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
           buf.AppendChar(iEscCode);
           status = 0;
         } else {
@@ -858,50 +859,33 @@
   if (!PositionIsInBounds())
     return CFX_ByteString();
 
-  int ch = m_pBuf[m_Pos++];
   CFX_ByteTextBuf buf;
-  FX_BOOL bFirst = TRUE;
+  bool bFirst = true;
   int code = 0;
-  while (1) {
-    if (ch == '>') {
-      break;
-    }
-    if (ch >= '0' && ch <= '9') {
-      if (bFirst) {
-        code = (ch - '0') * 16;
-      } else {
-        code += ch - '0';
-        buf.AppendChar((char)code);
-      }
-      bFirst = !bFirst;
-    } else if (ch >= 'A' && ch <= 'F') {
-      if (bFirst) {
-        code = (ch - 'A' + 10) * 16;
-      } else {
-        code += ch - 'A' + 10;
-        buf.AppendChar((char)code);
-      }
-      bFirst = !bFirst;
-    } else if (ch >= 'a' && ch <= 'f') {
-      if (bFirst) {
-        code = (ch - 'a' + 10) * 16;
-      } else {
-        code += ch - 'a' + 10;
-        buf.AppendChar((char)code);
-      }
-      bFirst = !bFirst;
-    }
-    if (!PositionIsInBounds())
+  while (PositionIsInBounds()) {
+    int ch = m_pBuf[m_Pos++];
+
+    if (ch == '>')
       break;
 
-    ch = m_pBuf[m_Pos++];
+    if (!std::isxdigit(ch))
+      continue;
+
+    int val = FXSYS_toHexDigit(ch);
+    if (bFirst) {
+      code = val * 16;
+    } else {
+      code += val;
+      buf.AppendByte((uint8_t)code);
+    }
+    bFirst = !bFirst;
   }
-  if (!bFirst) {
+  if (!bFirst)
     buf.AppendChar((char)code);
-  }
-  if (buf.GetLength() > MAX_STRING_LENGTH) {
+
+  if (buf.GetLength() > MAX_STRING_LENGTH)
     return CFX_ByteString(buf.GetBuffer(), MAX_STRING_LENGTH);
-  }
+
   return buf.GetByteString();
 }
 
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
index ff0519c..b2c7963 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_decode.cpp
@@ -9,6 +9,7 @@
 #include "core/include/fpdfapi/fpdf_module.h"
 #include "core/include/fpdfapi/fpdf_parser.h"
 #include "core/include/fxcodec/fx_codec.h"
+#include "core/include/fxcrt/fx_ext.h"
 
 #define _STREAM_MAX_SIZE_ 20 * 1024 * 1024
 
@@ -129,37 +130,32 @@
     }
   dest_buf = FX_Alloc(uint8_t, i / 2 + 1);
   dest_size = 0;
-  FX_BOOL bFirstDigit = TRUE;
+  bool bFirst = true;
   for (i = 0; i < src_size; i++) {
     uint8_t ch = src_buf[i];
     if (PDFCharIsLineEnding(ch) || ch == ' ' || ch == '\t')
       continue;
 
-    int digit;
-    if (ch <= '9' && ch >= '0') {
-      digit = ch - '0';
-    } else if (ch <= 'f' && ch >= 'a') {
-      digit = ch - 'a' + 10;
-    } else if (ch <= 'F' && ch >= 'A') {
-      digit = ch - 'A' + 10;
-    } else if (ch == '>') {
-      i++;
+    if (ch == '>') {
+      ++i;
       break;
-    } else {
+    }
+    if (!std::isxdigit(ch))
       continue;
-    }
-    if (bFirstDigit) {
+
+    int digit = FXSYS_toHexDigit(ch);
+    if (bFirst)
       dest_buf[dest_size] = digit * 16;
-    } else {
+    else
       dest_buf[dest_size++] += digit;
-    }
-    bFirstDigit = !bFirstDigit;
+
+    bFirst = !bFirst;
   }
-  if (!bFirstDigit) {
+  if (!bFirst)
     dest_size++;
-  }
   return i;
 }
+
 FX_DWORD RunLengthDecode(const uint8_t* src_buf,
                          FX_DWORD src_size,
                          uint8_t*& dest_buf,
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
index 2fa2762..9d95852 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_parser.cpp
@@ -14,6 +14,7 @@
 #include "core/include/fpdfapi/fpdf_module.h"
 #include "core/include/fpdfapi/fpdf_page.h"
 #include "core/include/fpdfapi/fpdf_parser.h"
+#include "core/include/fxcrt/fx_ext.h"
 #include "core/include/fxcrt/fx_safe_types.h"
 #include "third_party/base/nonstd_unique_ptr.h"
 #include "third_party/base/stl_util.h"
@@ -164,85 +165,83 @@
   m_bXRefStream = FALSE;
   m_LastXRefOffset = 0;
   m_bOwnFileRead = bOwnFileRead;
+
   int32_t offset = GetHeaderOffset(pFileAccess);
   if (offset == -1) {
-    if (bOwnFileRead && pFileAccess) {
+    if (bOwnFileRead && pFileAccess)
       pFileAccess->Release();
-    }
     return PDFPARSE_ERROR_FORMAT;
   }
   m_Syntax.InitParser(pFileAccess, offset);
+
   uint8_t ch;
-  if (!m_Syntax.GetCharAt(5, ch)) {
+  if (!m_Syntax.GetCharAt(5, ch))
     return PDFPARSE_ERROR_FORMAT;
-  }
-  if (ch >= '0' && ch <= '9') {
-    m_FileVersion = (ch - '0') * 10;
-  }
-  if (!m_Syntax.GetCharAt(7, ch)) {
+  if (std::isdigit(ch))
+    m_FileVersion = FXSYS_toDecimalDigit(ch) * 10;
+
+  if (!m_Syntax.GetCharAt(7, ch))
     return PDFPARSE_ERROR_FORMAT;
-  }
-  if (ch >= '0' && ch <= '9') {
-    m_FileVersion += ch - '0';
-  }
-  if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9) {
+  if (std::isdigit(ch))
+    m_FileVersion += FXSYS_toDecimalDigit(ch);
+
+  if (m_Syntax.m_FileLen < m_Syntax.m_HeaderOffset + 9)
     return PDFPARSE_ERROR_FORMAT;
-  }
+
   m_Syntax.RestorePos(m_Syntax.m_FileLen - m_Syntax.m_HeaderOffset - 9);
-  if (!bReParse) {
+  if (!bReParse)
     m_pDocument = new CPDF_Document(this);
-  }
+
   FX_BOOL bXRefRebuilt = FALSE;
   if (m_Syntax.SearchWord(FX_BSTRC("startxref"), TRUE, FALSE, 4096)) {
     FX_FILESIZE startxref_offset = m_Syntax.SavePos();
     void* pResult = FXSYS_bsearch(&startxref_offset, m_SortedOffset.GetData(),
                                   m_SortedOffset.GetSize(), sizeof(FX_FILESIZE),
                                   CompareFileSize);
-    if (pResult == NULL) {
+    if (!pResult)
       m_SortedOffset.Add(startxref_offset);
-    }
+
     m_Syntax.GetKeyword();
     FX_BOOL bNumber;
     CFX_ByteString xrefpos_str = m_Syntax.GetNextWord(bNumber);
-    if (!bNumber) {
+    if (!bNumber)
       return PDFPARSE_ERROR_FORMAT;
-    }
+
     m_LastXRefOffset = (FX_FILESIZE)FXSYS_atoi64(xrefpos_str);
     if (!LoadAllCrossRefV4(m_LastXRefOffset) &&
         !LoadAllCrossRefV5(m_LastXRefOffset)) {
-      if (!RebuildCrossRef()) {
+      if (!RebuildCrossRef())
         return PDFPARSE_ERROR_FORMAT;
-      }
+
       bXRefRebuilt = TRUE;
       m_LastXRefOffset = 0;
     }
   } else {
-    if (!RebuildCrossRef()) {
+    if (!RebuildCrossRef())
       return PDFPARSE_ERROR_FORMAT;
-    }
+
     bXRefRebuilt = TRUE;
   }
   FX_DWORD dwRet = SetEncryptHandler();
-  if (dwRet != PDFPARSE_ERROR_SUCCESS) {
+  if (dwRet != PDFPARSE_ERROR_SUCCESS)
     return dwRet;
-  }
+
   m_pDocument->LoadDoc();
-  if (m_pDocument->GetRoot() == NULL || m_pDocument->GetPageCount() == 0) {
-    if (bXRefRebuilt) {
+  if (!m_pDocument->GetRoot() || m_pDocument->GetPageCount() == 0) {
+    if (bXRefRebuilt)
       return PDFPARSE_ERROR_FORMAT;
-    }
+
     ReleaseEncryptHandler();
-    if (!RebuildCrossRef()) {
+    if (!RebuildCrossRef())
       return PDFPARSE_ERROR_FORMAT;
-    }
+
     dwRet = SetEncryptHandler();
-    if (dwRet != PDFPARSE_ERROR_SUCCESS) {
+    if (dwRet != PDFPARSE_ERROR_SUCCESS)
       return dwRet;
-    }
+
     m_pDocument->LoadDoc();
-    if (m_pDocument->GetRoot() == NULL) {
+    if (!m_pDocument->GetRoot())
       return PDFPARSE_ERROR_FORMAT;
-    }
   }
   FXSYS_qsort(m_SortedOffset.GetData(), m_SortedOffset.GetSize(),
               sizeof(FX_FILESIZE), CompareFileSize);
@@ -251,13 +250,12 @@
     ReleaseEncryptHandler();
     RebuildCrossRef();
     RootObjNum = GetRootObjNum();
-    if (RootObjNum == 0) {
+    if (RootObjNum == 0)
       return PDFPARSE_ERROR_FORMAT;
-    }
+
     dwRet = SetEncryptHandler();
-    if (dwRet != PDFPARSE_ERROR_SUCCESS) {
+    if (dwRet != PDFPARSE_ERROR_SUCCESS)
       return dwRet;
-    }
   }
   if (m_pSecurityHandler && !m_pSecurityHandler->IsMetadataEncrypted()) {
     CPDF_Reference* pMetadata =
@@ -461,9 +459,8 @@
         int32_t offset = FXSYS_atoi(pEntry);
         if (offset == 0) {
           for (int32_t c = 0; c < 10; c++) {
-            if (pEntry[c] < '0' || pEntry[c] > '9') {
+            if (!std::isdigit(pEntry[c]))
               return FALSE;
-            }
           }
         }
         m_CrossRef.SetAtGrow(objnum, offset);
@@ -562,9 +559,8 @@
             FX_FILESIZE offset = (FX_FILESIZE)FXSYS_atoi64(pEntry);
             if (offset == 0) {
               for (int32_t c = 0; c < 10; c++) {
-                if (pEntry[c] < '0' || pEntry[c] > '9') {
+                if (!std::isdigit(pEntry[c]))
                   return false;
-                }
               }
             }
             m_CrossRef.SetAtGrow(objnum, offset);
@@ -632,28 +628,32 @@
       uint8_t byte = buffer[i];
       switch (status) {
         case 0:
-          if (PDFCharIsWhitespace(byte)) {
+          if (PDFCharIsWhitespace(byte))
             status = 1;
-          }
-          if (byte <= '9' && byte >= '0') {
+
+          if (std::isdigit(byte)) {
             --i;
             status = 1;
           }
+
           if (byte == '%') {
             inside_index = 0;
             status = 9;
           }
+
           if (byte == '(') {
             status = 10;
             depth = 1;
           }
+
           if (byte == '<') {
             inside_index = 1;
             status = 11;
           }
-          if (byte == '\\') {
+
+          if (byte == '\\')
             status = 13;
-          }
+
           if (byte == 't') {
             status = 7;
             inside_index = 1;
@@ -662,10 +662,10 @@
         case 1:
           if (PDFCharIsWhitespace(byte)) {
             break;
-          } else if (byte <= '9' && byte >= '0') {
+          } else if (std::isdigit(byte)) {
             start_pos = pos + i;
             status = 2;
-            objnum = byte - '0';
+            objnum = FXSYS_toDecimalDigit(byte);
           } else if (byte == 't') {
             status = 7;
             inside_index = 1;
@@ -678,8 +678,8 @@
           }
           break;
         case 2:
-          if (byte <= '9' && byte >= '0') {
-            objnum = objnum * 10 + byte - '0';
+          if (std::isdigit(byte)) {
+            objnum = objnum * 10 + FXSYS_toDecimalDigit(byte);
             break;
           } else if (PDFCharIsWhitespace(byte)) {
             status = 3;
@@ -690,10 +690,10 @@
           }
           break;
         case 3:
-          if (byte <= '9' && byte >= '0') {
+          if (std::isdigit(byte)) {
             start_pos1 = pos + i;
             status = 4;
-            gennum = byte - '0';
+            gennum = FXSYS_toDecimalDigit(byte);
           } else if (PDFCharIsWhitespace(byte)) {
             break;
           } else if (byte == 't') {
@@ -705,8 +705,8 @@
           }
           break;
         case 4:
-          if (byte <= '9' && byte >= '0') {
-            gennum = gennum * 10 + byte - '0';
+          if (std::isdigit(byte)) {
+            gennum = gennum * 10 + FXSYS_toDecimalDigit(byte);
             break;
           } else if (PDFCharIsWhitespace(byte)) {
             status = 5;
@@ -721,9 +721,9 @@
             inside_index = 1;
           } else if (PDFCharIsWhitespace(byte)) {
             break;
-          } else if (byte <= '9' && byte >= '0') {
+          } else if (std::isdigit(byte)) {
             objnum = gennum;
-            gennum = byte - '0';
+            gennum = FXSYS_toDecimalDigit(byte);
             start_pos = start_pos1;
             start_pos1 = pos + i;
             status = 4;
@@ -1858,7 +1858,7 @@
         break;
       case 1:
         if (ch >= '0' && ch <= '7') {
-          iEscCode = ch - '0';
+          iEscCode = FXSYS_toDecimalDigit(ch);
           status = 2;
           break;
         }
@@ -1883,7 +1883,7 @@
         break;
       case 2:
         if (ch >= '0' && ch <= '7') {
-          iEscCode = iEscCode * 8 + ch - '0';
+          iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
           status = 3;
         } else {
           buf.AppendChar(iEscCode);
@@ -1893,7 +1893,7 @@
         break;
       case 3:
         if (ch >= '0' && ch <= '7') {
-          iEscCode = iEscCode * 8 + ch - '0';
+          iEscCode = iEscCode * 8 + FXSYS_toDecimalDigit(ch);
           buf.AppendChar(iEscCode);
           status = 0;
         } else {
@@ -1918,48 +1918,33 @@
 }
 CFX_ByteString CPDF_SyntaxParser::ReadHexString() {
   uint8_t ch;
-  if (!GetNextChar(ch)) {
+  if (!GetNextChar(ch))
     return CFX_ByteString();
-  }
+
   CFX_BinaryBuf buf;
-  FX_BOOL bFirst = TRUE;
+  bool bFirst = true;
   uint8_t code = 0;
   while (1) {
-    if (ch == '>') {
+    if (ch == '>')
       break;
-    }
-    if (ch >= '0' && ch <= '9') {
+
+    if (std::isxdigit(ch)) {
+      int val = FXSYS_toHexDigit(ch);
       if (bFirst) {
-        code = (ch - '0') * 16;
+        code = val * 16;
       } else {
-        code += ch - '0';
-        buf.AppendByte((uint8_t)code);
-      }
-      bFirst = !bFirst;
-    } else if (ch >= 'A' && ch <= 'F') {
-      if (bFirst) {
-        code = (ch - 'A' + 10) * 16;
-      } else {
-        code += ch - 'A' + 10;
-        buf.AppendByte((uint8_t)code);
-      }
-      bFirst = !bFirst;
-    } else if (ch >= 'a' && ch <= 'f') {
-      if (bFirst) {
-        code = (ch - 'a' + 10) * 16;
-      } else {
-        code += ch - 'a' + 10;
+        code += val;
         buf.AppendByte((uint8_t)code);
       }
       bFirst = !bFirst;
     }
-    if (!GetNextChar(ch)) {
+
+    if (!GetNextChar(ch))
       break;
-    }
   }
-  if (!bFirst) {
+  if (!bFirst)
     buf.AppendByte((uint8_t)code);
-  }
+
   return buf.GetByteString();
 }
 void CPDF_SyntaxParser::ToNextLine() {
diff --git a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
index 89a5deb..9729bab 100644
--- a/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
+++ b/core/src/fpdfapi/fpdf_parser/fpdf_parser_utility.cpp
@@ -5,6 +5,7 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include "core/include/fpdfapi/fpdf_parser.h"
+#include "core/include/fxcrt/fx_ext.h"
 
 // Indexed by 8-bit character code, contains either:
 //   'W' - for whitespace: NUL, TAB, CR, LF, FF, 0x80, 0xff
@@ -279,18 +280,7 @@
   }
   return FALSE;
 }
-static int _hex2dec(char ch) {
-  if (ch >= '0' && ch <= '9') {
-    return ch - '0';
-  }
-  if (ch >= 'a' && ch <= 'f') {
-    return ch - 'a' + 10;
-  }
-  if (ch >= 'A' && ch <= 'F') {
-    return ch - 'A' + 10;
-  }
-  return 0;
-}
+
 CFX_ByteString PDF_NameDecode(const CFX_ByteStringC& bstr) {
   int size = bstr.GetLength();
   const FX_CHAR* pSrc = bstr.GetCStr();
@@ -302,7 +292,8 @@
   FX_CHAR* pDest = pDestStart;
   for (int i = 0; i < size; i++) {
     if (pSrc[i] == '#' && i < size - 2) {
-      *pDest++ = _hex2dec(pSrc[i + 1]) * 16 + _hex2dec(pSrc[i + 2]);
+      *pDest++ =
+          FXSYS_toHexDigit(pSrc[i + 1]) * 16 + FXSYS_toHexDigit(pSrc[i + 2]);
       i += 2;
     } else {
       *pDest++ = pSrc[i];
diff --git a/core/src/fpdftext/fpdf_text.cpp b/core/src/fpdftext/fpdf_text.cpp
index 55ab483..bef8051 100644
--- a/core/src/fpdftext/fpdf_text.cpp
+++ b/core/src/fpdftext/fpdf_text.cpp
@@ -14,6 +14,8 @@
 #include "third_party/base/nonstd_unique_ptr.h"
 #include "txtproc.h"
 
+#include <cctype>
+
 CFX_ByteString CharFromUnicodeAlt(FX_WCHAR unicode,
                                   int destcp,
                                   const FX_CHAR* defchar) {
@@ -436,10 +438,9 @@
 static FX_BOOL IsNumber(CFX_WideString& str) {
   for (int i = 0; i < str.GetLength(); i++) {
     FX_WCHAR ch = str[i];
-    if ((ch < '0' || ch > '9') && ch != '-' && ch != '+' && ch != '.' &&
-        ch != ' ') {
+    // TODO(dsinclair): --.+ +.-- should probably not be a number.
+    if (!std::iswdigit(ch) && ch != '-' && ch != '+' && ch != '.' && ch != ' ')
       return FALSE;
-    }
   }
   return TRUE;
 }
diff --git a/core/src/fpdftext/fpdf_text_int.cpp b/core/src/fpdftext/fpdf_text_int.cpp
index dd6be31..7a1000e 100644
--- a/core/src/fpdftext/fpdf_text_int.cpp
+++ b/core/src/fpdftext/fpdf_text_int.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include <ctype.h>
+#include <cctype>
 #include <algorithm>
 
 #include "core/include/fpdfapi/fpdf_module.h"
@@ -2416,8 +2416,8 @@
 FX_BOOL CPDF_TextPageFind::IsMatchWholeWord(const CFX_WideString& csPageText,
                                             int startPos,
                                             int endPos) {
-  int char_left = 0;
-  int char_right = 0;
+  FX_WCHAR char_left = 0;
+  FX_WCHAR char_right = 0;
   int char_count = endPos - startPos + 1;
   if (char_count < 1) {
     return FALSE;
@@ -2433,12 +2433,11 @@
   }
   if ((char_left > 'A' && char_left < 'a') ||
       (char_left > 'a' && char_left < 'z') ||
-      (char_left > 0xfb00 && char_left < 0xfb06) ||
-      (char_left >= '0' && char_left <= '9') ||
+      (char_left > 0xfb00 && char_left < 0xfb06) || std::iswdigit(char_left) ||
       (char_right > 'A' && char_right < 'a') ||
       (char_right > 'a' && char_right < 'z') ||
       (char_right > 0xfb00 && char_right < 0xfb06) ||
-      (char_right >= '0' && char_right <= '9')) {
+      std::iswdigit(char_right)) {
     return FALSE;
   }
   if (!(('A' > char_left || char_left > 'Z') &&
diff --git a/core/src/fxcodec/codec/fx_codec.cpp b/core/src/fxcodec/codec/fx_codec.cpp
index bfa5bef..51a1f5d 100644
--- a/core/src/fxcodec/codec/fx_codec.cpp
+++ b/core/src/fxcodec/codec/fx_codec.cpp
@@ -1,3 +1,4 @@
+
 // Copyright 2014 PDFium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
@@ -9,6 +10,7 @@
 #include <cmath>
 
 #include "codec_int.h"
+#include "core/include/fxcrt/fx_ext.h"
 #include "core/include/fxcrt/fx_safe_types.h"
 #include "third_party/base/logging.h"
 
@@ -147,6 +149,20 @@
                                             FX_DWORD& dest_size) {
   return FALSE;
 }
+
+#define EXPONENT_DETECT(ptr)                 \
+  for (;; ptr++) {                           \
+    if (!std::isdigit(*ptr)) {               \
+      if (endptr)                            \
+        *endptr = (char*)ptr;                \
+      break;                                 \
+    } else {                                 \
+      exp_ret *= 10;                         \
+      exp_ret += FXSYS_toDecimalDigit(*ptr); \
+      continue;                              \
+    }                                        \
+  }
+
 extern "C" double FXstrtod(const char* nptr, char** endptr) {
   double ret = 0.0;
   const char* ptr = nptr;
@@ -157,20 +173,20 @@
     return 0.0;
   }
   for (;; ptr++) {
-    if (!e_number && !e_point && (*ptr == '\t' || *ptr == ' ')) {
+    if (!e_number && !e_point && (*ptr == '\t' || *ptr == ' '))
       continue;
-    }
-    if (*ptr >= '0' && *ptr <= '9') {
-      if (!e_number) {
+
+    if (std::isdigit(*ptr)) {
+      if (!e_number)
         e_number = 1;
-      }
+
       if (!e_point) {
         ret *= 10;
-        ret += (*ptr - '0');
+        ret += FXSYS_toDecimalDigit(*ptr);
       } else {
         fra_count++;
         fra_ret *= 10;
-        fra_ret += (*ptr - '0');
+        fra_ret += FXSYS_toDecimalDigit(*ptr);
       }
       continue;
     }
@@ -188,29 +204,17 @@
       }
     }
     if (e_number && (*ptr == 'e' || *ptr == 'E')) {
-#define EXPONENT_DETECT(ptr)        \
-  for (;; ptr++) {                  \
-    if (*ptr < '0' || *ptr > '9') { \
-      if (endptr)                   \
-        *endptr = (char*)ptr;       \
-      break;                        \
-    } else {                        \
-      exp_ret *= 10;                \
-      exp_ret += (*ptr - '0');      \
-      continue;                     \
-    }                               \
-  }
       exp_ptr = ptr++;
       if (*ptr == '+' || *ptr == '-') {
         exp_sig = (*ptr++ == '+') ? 1 : -1;
-        if (*ptr < '0' || *ptr > '9') {
+        if (!std::isdigit(*ptr)) {
           if (endptr) {
             *endptr = (char*)exp_ptr;
           }
           break;
         }
         EXPONENT_DETECT(ptr);
-      } else if (*ptr >= '0' && *ptr <= '9') {
+      } else if (std::isdigit(*ptr)) {
         EXPONENT_DETECT(ptr);
       } else {
         if (endptr) {
@@ -218,7 +222,6 @@
         }
         break;
       }
-#undef EXPONENT_DETECT
       break;
     }
     if (ptr != nptr && !e_number) {
@@ -247,6 +250,8 @@
   }
   return is_negative ? -ret : ret;
 }
+#undef EXPONENT_DETECT
+
 FX_BOOL CCodec_BasicModule::A85Encode(const uint8_t* src_buf,
                                       FX_DWORD src_size,
                                       uint8_t*& dest_buf,
diff --git a/core/src/fxcrt/fx_basic_bstring.cpp b/core/src/fxcrt/fx_basic_bstring.cpp
index 9d64fbe..574e57a 100644
--- a/core/src/fxcrt/fx_basic_bstring.cpp
+++ b/core/src/fxcrt/fx_basic_bstring.cpp
@@ -5,6 +5,7 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include <stddef.h>  // For offsetof().
+#include <cctype>
 
 #include "core/include/fxcrt/fx_basic.h"
 #include "third_party/base/numerics/safe_math.h"
@@ -493,8 +494,8 @@
     }
     if (nWidth == 0) {
       nWidth = FXSYS_atoi(lpsz);
-      for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz++)
-        ;
+      while (std::isdigit(*lpsz))
+        lpsz++;
     }
     if (nWidth < 0 || nWidth > 128 * 1024) {
       lpszFormat = "Bad width";
@@ -509,8 +510,8 @@
         lpsz++;
       } else {
         nPrecision = FXSYS_atoi(lpsz);
-        for (; (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz++)
-          ;
+        while (std::isdigit(*lpsz))
+          lpsz++;
       }
     }
     if (nPrecision < 0 || nPrecision > 128 * 1024) {
diff --git a/core/src/fxcrt/fx_basic_gcc.cpp b/core/src/fxcrt/fx_basic_gcc.cpp
index f8b0c7a..c352ee3 100644
--- a/core/src/fxcrt/fx_basic_gcc.cpp
+++ b/core/src/fxcrt/fx_basic_gcc.cpp
@@ -5,29 +5,49 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include <limits>
+#include <cctype>
+#include <cwctype>
 
 #include "core/include/fxcrt/fx_ext.h"
 #include "core/include/fxcrt/fx_string.h"
 
-template <class T, class STR_T>
-T FXSYS_StrToInt(STR_T str) {
+template <class T>
+T FXSYS_StrToInt(const FX_CHAR* str) {
   FX_BOOL neg = FALSE;
-  if (str == NULL) {
+  if (!str)
     return 0;
-  }
+
   if (*str == '-') {
     neg = TRUE;
     str++;
   }
   T num = 0;
-  while (*str) {
-    if ((*str) < '0' || (*str) > '9') {
+  while (*str && std::isdigit(*str)) {
+    if (num > (std::numeric_limits<T>::max() - 9) / 10)
       break;
-    }
-    if (num > (std::numeric_limits<T>::max() - 9) / 10) {
+
+    num = num * 10 + FXSYS_toDecimalDigit(*str);
+    str++;
+  }
+  return neg ? -num : num;
+}
+
+template <class T>
+T FXSYS_StrToInt(const FX_WCHAR* str) {
+  FX_BOOL neg = FALSE;
+  if (!str)
+    return 0;
+
+  if (*str == '-') {
+    neg = TRUE;
+    str++;
+  }
+  T num = 0;
+  while (*str && std::iswdigit(*str)) {
+    if (num > (std::numeric_limits<T>::max() - 9) / 10)
       break;
-    }
-    num = num * 10 + (*str) - '0';
+
+    num = num * 10 + FXSYS_toDecimalDigitWide(*str);
     str++;
   }
   return neg ? -num : num;
@@ -71,16 +91,16 @@
 extern "C" {
 #endif
 int32_t FXSYS_atoi(const FX_CHAR* str) {
-  return FXSYS_StrToInt<int32_t, const FX_CHAR*>(str);
+  return FXSYS_StrToInt<int32_t>(str);
 }
 int32_t FXSYS_wtoi(const FX_WCHAR* str) {
-  return FXSYS_StrToInt<int32_t, const FX_WCHAR*>(str);
+  return FXSYS_StrToInt<int32_t>(str);
 }
 int64_t FXSYS_atoi64(const FX_CHAR* str) {
-  return FXSYS_StrToInt<int64_t, const FX_CHAR*>(str);
+  return FXSYS_StrToInt<int64_t>(str);
 }
 int64_t FXSYS_wtoi64(const FX_WCHAR* str) {
-  return FXSYS_StrToInt<int64_t, const FX_WCHAR*>(str);
+  return FXSYS_StrToInt<int64_t>(str);
 }
 const FX_CHAR* FXSYS_i64toa(int64_t value, FX_CHAR* str, int radix) {
   return FXSYS_IntToStr<int64_t, uint64_t, FX_CHAR*>(value, str, radix);
diff --git a/core/src/fxcrt/fx_basic_util.cpp b/core/src/fxcrt/fx_basic_util.cpp
index 3e9d616..b4c7064 100644
--- a/core/src/fxcrt/fx_basic_util.cpp
+++ b/core/src/fxcrt/fx_basic_util.cpp
@@ -5,6 +5,9 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include "core/include/fxcrt/fx_basic.h"
+#include "core/include/fxcrt/fx_ext.h"
+
+#include <cctype>
 
 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
 #include <sys/types.h>
@@ -102,14 +105,11 @@
       bNegative = TRUE;
       cc++;
     }
-    while (cc < len) {
-      if (str[cc] < '0' || str[cc] > '9') {
+    while (cc < len && std::isdigit(str[cc])) {
+      // TODO(dsinclair): This is not the right way to handle overflow.
+      integer = integer * 10 + FXSYS_toDecimalDigit(str[cc]);
+      if (integer < 0)
         break;
-      }
-      integer = integer * 10 + str[cc] - '0';
-      if (integer < 0) {
-        break;
-      }
       cc++;
     }
     if (bNegative) {
@@ -146,7 +146,7 @@
     if (str[cc] == '.') {
       break;
     }
-    value = value * 10 + str[cc] - '0';
+    value = value * 10 + FXSYS_toDecimalDigit(str[cc]);
     cc++;
   }
   static const FX_FLOAT fraction_scales[] = {
@@ -157,7 +157,7 @@
   if (cc < len && str[cc] == '.') {
     cc++;
     while (cc < len) {
-      value += fraction_scales[scale] * (str[cc] - '0');
+      value += fraction_scales[scale] * FXSYS_toDecimalDigit(str[cc]);
       scale++;
       if (scale == sizeof fraction_scales / sizeof(FX_FLOAT)) {
         break;
diff --git a/core/src/fxcrt/fx_basic_wstring.cpp b/core/src/fxcrt/fx_basic_wstring.cpp
index 131672d..220ffbd 100644
--- a/core/src/fxcrt/fx_basic_wstring.cpp
+++ b/core/src/fxcrt/fx_basic_wstring.cpp
@@ -5,8 +5,10 @@
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
 #include <stddef.h>  // For offsetof().
+#include <cctype>
 
 #include "core/include/fxcrt/fx_basic.h"
+#include "core/include/fxcrt/fx_ext.h"
 #include "third_party/base/numerics/safe_math.h"
 
 // static
@@ -765,8 +767,8 @@
     }
     if (nWidth == 0) {
       nWidth = FXSYS_wtoi(lpsz);
-      for (; *lpsz != 0 && (*lpsz) <= '9' && (*lpsz) >= '0'; lpsz++)
-        ;
+      while (std::iswdigit(*lpsz))
+        ++lpsz;
     }
     if (nWidth < 0 || nWidth > 128 * 1024) {
       lpszFormat = L"Bad width";
@@ -781,8 +783,8 @@
         lpsz++;
       } else {
         nPrecision = FXSYS_wtoi(lpsz);
-        for (; *lpsz != 0 && (*lpsz) >= '0' && (*lpsz) <= '9'; lpsz++)
-          ;
+        while (std::iswdigit(*lpsz))
+          ++lpsz;
       }
     }
     if (nPrecision < 0 || nPrecision > 128 * 1024) {
@@ -968,7 +970,7 @@
     if (str[cc] == '.') {
       break;
     }
-    integer = integer * 10 + str[cc] - '0';
+    integer = integer * 10 + FXSYS_toDecimalDigitWide(str[cc]);
     cc++;
   }
   FX_FLOAT fraction = 0;
@@ -976,7 +978,7 @@
     cc++;
     FX_FLOAT scale = 0.1f;
     while (cc < len) {
-      fraction += scale * (str[cc] - '0');
+      fraction += scale * FXSYS_toDecimalDigitWide(str[cc]);
       scale *= 0.1f;
       cc++;
     }
diff --git a/core/src/fxcrt/fx_extension.cpp b/core/src/fxcrt/fx_extension.cpp
index 7eb86d6..37437ae 100644
--- a/core/src/fxcrt/fx_extension.cpp
+++ b/core/src/fxcrt/fx_extension.cpp
@@ -51,9 +51,7 @@
 IFX_MemoryStream* FX_CreateMemoryStream(FX_BOOL bConsecutive) {
   return new CFX_MemoryStream(bConsecutive);
 }
-#ifdef __cplusplus
-extern "C" {
-#endif
+
 FX_FLOAT FXSYS_tan(FX_FLOAT a) {
   return (FX_FLOAT)tan(a);
 }
@@ -190,12 +188,7 @@
   }
   return dwHashCode;
 }
-#ifdef __cplusplus
-}
-#endif
-#ifdef __cplusplus
-extern "C" {
-#endif
+
 void* FX_Random_MT_Start(FX_DWORD dwSeed) {
   FX_LPMTRANDOMCONTEXT pContext = FX_Alloc(FX_MTRANDOMCONTEXT, 1);
   pContext->mt[0] = dwSeed;
@@ -298,6 +291,3 @@
   FX_Random_GenerateBase(pBuffer, iCount);
 #endif
 }
-#ifdef __cplusplus
-}
-#endif
diff --git a/core/src/fxcrt/fx_extension_unittest.cpp b/core/src/fxcrt/fx_extension_unittest.cpp
new file mode 100644
index 0000000..eff8878
--- /dev/null
+++ b/core/src/fxcrt/fx_extension_unittest.cpp
@@ -0,0 +1,24 @@
+// Copyright 2015 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include "../../include/fxcrt/fx_ext.h"
+
+TEST(fxcrt, FXSYS_toHexDigit) {
+  EXPECT_EQ(10, FXSYS_toHexDigit('a'));
+  EXPECT_EQ(10, FXSYS_toHexDigit('A'));
+  EXPECT_EQ(7, FXSYS_toHexDigit('7'));
+  EXPECT_EQ(0, FXSYS_toHexDigit('i'));
+}
+
+TEST(fxcrt, FXSYS_toDecimalDigit) {
+  EXPECT_EQ(7, FXSYS_toDecimalDigit('7'));
+  EXPECT_EQ(0, FXSYS_toDecimalDigit('a'));
+}
+
+TEST(fxcrt, FXSYS_toDecimalDigitWide) {
+  EXPECT_EQ(7, FXSYS_toDecimalDigitWide(L'7'));
+  EXPECT_EQ(0, FXSYS_toDecimalDigitWide(L'a'));
+}
diff --git a/core/src/fxcrt/fx_xml_parser.cpp b/core/src/fxcrt/fx_xml_parser.cpp
index 429bc38..2d3ff66 100644
--- a/core/src/fxcrt/fx_xml_parser.cpp
+++ b/core/src/fxcrt/fx_xml_parser.cpp
@@ -6,6 +6,7 @@
 
 #include "xml_int.h"
 
+#include "core/include/fxcrt/fx_ext.h"
 #include "core/include/fxcrt/fx_xml.h"
 
 CXML_Parser::~CXML_Parser() {
@@ -228,9 +229,8 @@
             iState = 10;
             break;
           }
-          if (g_FXCRT_XML_IsDigital(ch)) {
-            code = code * 10 + ch - '0';
-          }
+          if (g_FXCRT_XML_IsDigital(ch))
+            code = code * 10 + FXSYS_toDecimalDigit(ch);
           break;
         case 4:
           m_dwIndex++;
@@ -242,7 +242,7 @@
               g_FXCRT_XML_ByteTypes[ch] & FXCRTM_XML_CHARTYPE_HexChar;
           if (nHex) {
             if (nHex == FXCRTM_XML_CHARTYPE_HexDigital) {
-              code = (code << 4) + ch - '0';
+              code = (code << 4) + FXSYS_toDecimalDigit(ch);
             } else if (nHex == FXCRTM_XML_CHARTYPE_HexLowerLetter) {
               code = (code << 4) + ch - 87;
             } else {
diff --git a/fpdfsdk/src/fsdk_baseannot.cpp b/fpdfsdk/src/fsdk_baseannot.cpp
index 52f34fa..1ccac92 100644
--- a/fpdfsdk/src/fsdk_baseannot.cpp
+++ b/fpdfsdk/src/fsdk_baseannot.cpp
@@ -4,6 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
+#include "../../core/include/fxcrt/fx_ext.h"
 #include "../include/fsdk_define.h"
 #include "../include/fsdk_mgr.h"
 #include "../include/fsdk_baseannot.h"
@@ -216,12 +217,9 @@
     int i = 0;
     int j, k;
     FX_CHAR ch;
-    while (i < strLength) {
-      ch = dtStr[i];
-      if (ch >= '0' && ch <= '9')
-        break;
-      i++;
-    }
+    while (i < strLength && !std::isdigit(dtStr[i]))
+      ++i;
+
     if (i >= strLength)
       return *this;
 
@@ -229,9 +227,9 @@
     k = 0;
     while (i < strLength && j < 4) {
       ch = dtStr[i];
-      k = k * 10 + ch - '0';
+      k = k * 10 + FXSYS_toDecimalDigit(ch);
       j++;
-      if (ch < '0' || ch > '9')
+      if (!std::isdigit(ch))
         break;
       i++;
     }
@@ -243,9 +241,9 @@
     k = 0;
     while (i < strLength && j < 2) {
       ch = dtStr[i];
-      k = k * 10 + ch - '0';
+      k = k * 10 + FXSYS_toDecimalDigit(ch);
       j++;
-      if (ch < '0' || ch > '9')
+      if (!std::isdigit(ch))
         break;
       i++;
     }
@@ -257,9 +255,9 @@
     k = 0;
     while (i < strLength && j < 2) {
       ch = dtStr[i];
-      k = k * 10 + ch - '0';
+      k = k * 10 + FXSYS_toDecimalDigit(ch);
       j++;
-      if (ch < '0' || ch > '9')
+      if (!std::isdigit(ch))
         break;
       i++;
     }
@@ -271,9 +269,9 @@
     k = 0;
     while (i < strLength && j < 2) {
       ch = dtStr[i];
-      k = k * 10 + ch - '0';
+      k = k * 10 + FXSYS_toDecimalDigit(ch);
       j++;
-      if (ch < '0' || ch > '9')
+      if (!std::isdigit(ch))
         break;
       i++;
     }
@@ -285,9 +283,9 @@
     k = 0;
     while (i < strLength && j < 2) {
       ch = dtStr[i];
-      k = k * 10 + ch - '0';
+      k = k * 10 + FXSYS_toDecimalDigit(ch);
       j++;
-      if (ch < '0' || ch > '9')
+      if (!std::isdigit(ch))
         break;
       i++;
     }
@@ -299,9 +297,9 @@
     k = 0;
     while (i < strLength && j < 2) {
       ch = dtStr[i];
-      k = k * 10 + ch - '0';
+      k = k * 10 + FXSYS_toDecimalDigit(ch);
       j++;
-      if (ch < '0' || ch > '9')
+      if (!std::isdigit(ch))
         break;
       i++;
     }
@@ -320,9 +318,9 @@
     k = 0;
     while (i < strLength && j < 2) {
       ch = dtStr[i];
-      k = k * 10 + ch - '0';
+      k = k * 10 + FXSYS_toDecimalDigit(ch);
       j++;
-      if (ch < '0' || ch > '9')
+      if (!std::isdigit(ch))
         break;
       i++;
     }
@@ -337,9 +335,9 @@
     k = 0;
     while (i < strLength && j < 2) {
       ch = dtStr[i];
-      k = k * 10 + ch - '0';
+      k = k * 10 + FXSYS_toDecimalDigit(ch);
       j++;
-      if (ch < '0' || ch > '9')
+      if (!std::isdigit(ch))
         break;
       i++;
     }
diff --git a/fpdfsdk/src/javascript/PublicMethods.cpp b/fpdfsdk/src/javascript/PublicMethods.cpp
index 92b4766..8e8cb21 100644
--- a/fpdfsdk/src/javascript/PublicMethods.cpp
+++ b/fpdfsdk/src/javascript/PublicMethods.cpp
@@ -6,6 +6,7 @@
 
 #include "PublicMethods.h"
 
+#include "../../../core/include/fxcrt/fx_ext.h"
 #include "../../include/fsdk_mgr.h"  // For CPDFDoc_Environment.
 #include "../../include/javascript/IJavaScript.h"
 #include "Field.h"
@@ -116,7 +117,7 @@
 }
 
 FX_BOOL CJS_PublicMethods::IsDigit(char ch) {
-  return (ch >= '0' && ch <= '9');
+  return std::isdigit(ch);
 }
 
 FX_BOOL CJS_PublicMethods::IsAlphabetic(wchar_t ch) {
@@ -396,7 +397,7 @@
 
     FX_WCHAR c = string.GetAt(i);
     if (IsDigit((wchar_t)c)) {
-      nRet = nRet * 10 + (c - '0');
+      nRet = nRet * 10 + FXSYS_toDecimalDigitWide(c);
       nSkip = i - nStart + 1;
       if (nSkip >= nMaxStep)
         break;
diff --git a/fpdfsdk/src/javascript/util.cpp b/fpdfsdk/src/javascript/util.cpp
index 14e15c1..fc94a0e 100644
--- a/fpdfsdk/src/javascript/util.cpp
+++ b/fpdfsdk/src/javascript/util.cpp
@@ -6,6 +6,7 @@
 
 #include "util.h"
 
+#include "../../../core/include/fxcrt/fx_ext.h"
 #include "../../include/javascript/IJavaScript.h"
 #include "JS_Context.h"
 #include "JS_Define.h"
@@ -425,7 +426,7 @@
         break;
       case 'X': {
         while (itSource < iSize) {
-          if ((cSource[itSource] >= '0' && cSource[itSource] <= '9') ||
+          if (std::isdigit(cSource[itSource]) ||
               (cSource[itSource] >= 'a' && cSource[itSource] <= 'z') ||
               (cSource[itSource] >= 'A' && cSource[itSource] <= 'Z')) {
             cPurpose += cSource[itSource];
@@ -450,7 +451,7 @@
       } break;
       case '9': {
         while (itSource < iSize) {
-          if (cSource[itSource] >= '0' && cSource[itSource] <= '9') {
+          if (std::isdigit(cSource[itSource])) {
             cPurpose += cSource[itSource];
             itSource++;
             break;
@@ -531,7 +532,7 @@
   total = 0;
 
   while (isdigit(c)) {
-    total = 10 * total + (c - '0');  /* accumulate digit */
+    total = 10 * total + FXSYS_toDecimalDigit(c); /* accumulate digit */
     c = (int)(unsigned char)*nptr++; /* get next char */
   }
 
diff --git a/pdfium.gyp b/pdfium.gyp
index 33c4e19..28d65fb 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -727,6 +727,7 @@
         'core/src/fxcrt/fx_basic_memmgr_unittest.cpp',
         'core/src/fxcrt/fx_basic_wstring_unittest.cpp',
         'core/src/fxcrt/fx_bidi_unittest.cpp',
+        'core/src/fxcrt/fx_extension_unittest.cpp',
         'core/src/fxcrt/fx_system_unittest.cpp',
         'testing/fx_string_testhelpers.h',
         'testing/fx_string_testhelpers.cpp',
