diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index 199e0a3..9180d6c 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -660,11 +660,10 @@
                                         WideString& csMsg) {
   WideString srcURL = csURL;
   srcURL.TrimWhitespaceFront();
-  if (srcURL.Left(7).CompareNoCase(L"mailto:") != 0)
+  if (!srcURL.Left(7).EqualsASCIINoCase("mailto:")) {
     return false;
-
+  }
   auto pos = srcURL.Find(L'?');
-
   {
     WideString tmp;
     if (!pos.has_value()) {
@@ -687,23 +686,21 @@
     pos = srcURL.Find(L'&');
     WideString tmp = (!pos.has_value()) ? srcURL : srcURL.Left(pos.value());
     tmp.TrimWhitespace();
-    if (tmp.GetLength() >= 3 && tmp.Left(3).CompareNoCase(L"cc=") == 0) {
+    if (tmp.GetLength() >= 3 && tmp.Left(3).EqualsASCIINoCase("cc=")) {
       tmp = tmp.Right(tmp.GetLength() - 3);
       if (!csCCAddress.IsEmpty())
         csCCAddress += L';';
       csCCAddress += tmp;
-    } else if (tmp.GetLength() >= 4 &&
-               tmp.Left(4).CompareNoCase(L"bcc=") == 0) {
+    } else if (tmp.GetLength() >= 4 && tmp.Left(4).EqualsASCIINoCase("bcc=")) {
       tmp = tmp.Right(tmp.GetLength() - 4);
       if (!csBCCAddress.IsEmpty())
         csBCCAddress += L';';
       csBCCAddress += tmp;
     } else if (tmp.GetLength() >= 8 &&
-               tmp.Left(8).CompareNoCase(L"subject=") == 0) {
+               tmp.Left(8).EqualsASCIINoCase("subject=")) {
       tmp = tmp.Right(tmp.GetLength() - 8);
       csSubject += tmp;
-    } else if (tmp.GetLength() >= 5 &&
-               tmp.Left(5).CompareNoCase(L"body=") == 0) {
+    } else if (tmp.GetLength() >= 5 && tmp.Left(5).EqualsASCIINoCase("body=")) {
       tmp = tmp.Right(tmp.GetLength() - 5);
       csMsg += tmp;
     }
@@ -952,7 +949,7 @@
   if (!pFileHandler)
     return false;
 
-  if (csURL.Left(7).CompareNoCase(L"mailto:") == 0) {
+  if (csURL.Left(7).EqualsASCIINoCase("mailto:")) {
     WideString csToAddress;
     WideString csCCAddress;
     WideString csBCCAddress;
diff --git a/fxjs/cjs_publicmethods.cpp b/fxjs/cjs_publicmethods.cpp
index 2f1dc7d..379bed7 100644
--- a/fxjs/cjs_publicmethods.cpp
+++ b/fxjs/cjs_publicmethods.cpp
@@ -543,7 +543,7 @@
             case 'm':
               i += 3;
               if (FX_IsValidMonth(nMonth))
-                sPart += fxjs::kMonths[nMonth - 1];
+                sPart += WideString::FromASCII(fxjs::kMonths[nMonth - 1]);
               break;
             default:
               i += 3;
@@ -561,7 +561,7 @@
             case 'm':
               i += 4;
               if (FX_IsValidMonth(nMonth))
-                sPart += fxjs::kFullMonths[nMonth - 1];
+                sPart += WideString::FromASCII(fxjs::kFullMonths[nMonth - 1]);
               break;
             default:
               i += 4;
@@ -933,7 +933,7 @@
   int nMonth = 1;
   sTemp = wsArray[1];
   for (size_t i = 0; i < std::size(fxjs::kMonths); ++i) {
-    if (sTemp == fxjs::kMonths[i]) {
+    if (sTemp.EqualsASCII(fxjs::kMonths[i])) {
       nMonth = static_cast<int>(i) + 1;
       break;
     }
diff --git a/fxjs/fx_date_helpers.cpp b/fxjs/fx_date_helpers.cpp
index 3d7d1f3..9601e96 100644
--- a/fxjs/fx_date_helpers.cpp
+++ b/fxjs/fx_date_helpers.cpp
@@ -168,14 +168,12 @@
 
 }  // namespace
 
-const wchar_t* const kMonths[12] = {L"Jan", L"Feb", L"Mar", L"Apr",
-                                    L"May", L"Jun", L"Jul", L"Aug",
-                                    L"Sep", L"Oct", L"Nov", L"Dec"};
+const char* const kMonths[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
+                                 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
 
-const wchar_t* const kFullMonths[12] = {L"January", L"February", L"March",
-                                        L"April",   L"May",      L"June",
-                                        L"July",    L"August",   L"September",
-                                        L"October", L"November", L"December"};
+const char* const kFullMonths[12] = {
+    "January", "February", "March",     "April",   "May",      "June",
+    "July",    "August",   "September", "October", "November", "December"};
 
 static constexpr size_t KMonthAbbreviationLength = 3;  // Anything in |kMonths|.
 static constexpr size_t kLongestFullMonthLength = 9;   // September
@@ -436,7 +434,7 @@
               if (nSkip == KMonthAbbreviationLength) {
                 WideString sMonth = value.Substr(j, KMonthAbbreviationLength);
                 for (size_t m = 0; m < std::size(kMonths); ++m) {
-                  if (sMonth.CompareNoCase(kMonths[m]) == 0) {
+                  if (sMonth.EqualsASCIINoCase(kMonths[m])) {
                     nMonth = static_cast<int>(m) + 1;
                     i += 3;
                     j += nSkip;
@@ -473,7 +471,7 @@
                 WideString sMonth = value.Substr(j, nSkip);
                 sMonth.MakeLower();
                 for (size_t m = 0; m < std::size(kFullMonths); ++m) {
-                  WideString sFullMonths = WideString(kFullMonths[m]);
+                  auto sFullMonths = WideString::FromASCII(kFullMonths[m]);
                   sFullMonths.MakeLower();
                   if (sFullMonths.Contains(sMonth.AsStringView())) {
                     nMonth = static_cast<int>(m) + 1;
diff --git a/fxjs/fx_date_helpers.h b/fxjs/fx_date_helpers.h
index 6f6f403..ca730e5 100644
--- a/fxjs/fx_date_helpers.h
+++ b/fxjs/fx_date_helpers.h
@@ -15,8 +15,8 @@
 
 enum class ConversionStatus { kSuccess = 0, kBadFormat, kBadDate };
 
-extern const wchar_t* const kMonths[12];
-extern const wchar_t* const kFullMonths[12];
+extern const char* const kMonths[12];
+extern const char* const kFullMonths[12];
 
 double FX_GetDateTime();
 int FX_GetYearFromTime(double dt);
diff --git a/xfa/fxfa/cxfa_ffbarcode.cpp b/xfa/fxfa/cxfa_ffbarcode.cpp
index 94acad2..176c77f 100644
--- a/xfa/fxfa/cxfa_ffbarcode.cpp
+++ b/xfa/fxfa/cxfa_ffbarcode.cpp
@@ -95,10 +95,12 @@
 
 std::optional<BC_CHAR_ENCODING> CharEncodingFromString(
     const WideString& value) {
-  if (value.CompareNoCase(L"UTF-16"))
+  if (value.EqualsASCIINoCase("UTF-16")) {
     return BC_CHAR_ENCODING::kUnicode;
-  if (value.CompareNoCase(L"UTF-8"))
+  }
+  if (value.EqualsASCIINoCase("UTF-8")) {
     return BC_CHAR_ENCODING::kUTF8;
+  }
   return std::nullopt;
 }
 
