diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 0872317..c44e28a 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -93,7 +93,7 @@
       if (full_name.IsEmpty())
         full_name = std::move(short_name);
       else
-        full_name = short_name + L"." + full_name;
+        full_name = short_name + L'.' + full_name;
     }
     pLevel = pLevel->GetDictFor("Parent");
     if (pdfium::ContainsKey(visited, pLevel))
@@ -300,12 +300,12 @@
 
 WideString CPDF_FormField::GetAlternateName() const {
   const CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict.Get(), "TU");
-  return pObj ? pObj->GetUnicodeText() : L"";
+  return pObj ? pObj->GetUnicodeText() : WideString();
 }
 
 WideString CPDF_FormField::GetMappingName() const {
   const CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict.Get(), "TM");
-  return pObj ? pObj->GetUnicodeText() : L"";
+  return pObj ? pObj->GetUnicodeText() : WideString();
 }
 
 uint32_t CPDF_FormField::GetFieldFlags() const {
diff --git a/core/fpdfdoc/cpdf_pagelabel.cpp b/core/fpdfdoc/cpdf_pagelabel.cpp
index b622073..192e142 100644
--- a/core/fpdfdoc/cpdf_pagelabel.cpp
+++ b/core/fpdfdoc/cpdf_pagelabel.cpp
@@ -51,7 +51,7 @@
 
 WideString GetLabelNumPortion(int num, const ByteString& bsStyle) {
   if (bsStyle.IsEmpty())
-    return L"";
+    return WideString();
   if (bsStyle == "D")
     return WideString::Format(L"%d", num);
   if (bsStyle == "R") {
@@ -68,7 +68,7 @@
   }
   if (bsStyle == "a")
     return MakeLetters(num);
-  return L"";
+  return WideString();
 }
 
 }  // namespace
diff --git a/core/fpdftext/cpdf_linkextract.cpp b/core/fpdftext/cpdf_linkextract.cpp
index d1da327..cdbf46a 100644
--- a/core/fpdftext/cpdf_linkextract.cpp
+++ b/core/fpdftext/cpdf_linkextract.cpp
@@ -306,7 +306,8 @@
 }
 
 WideString CPDF_LinkExtract::GetURL(size_t index) const {
-  return index < m_LinkArray.size() ? m_LinkArray[index].m_strUrl : L"";
+  return index < m_LinkArray.size() ? m_LinkArray[index].m_strUrl
+                                    : WideString();
 }
 
 std::vector<CFX_FloatRect> CPDF_LinkExtract::GetRects(size_t index) const {
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 259167b..1a279e9 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -473,7 +473,7 @@
 WideString CPDF_TextPage::GetPageText(int start, int count) const {
   if (start < 0 || start >= CountChars() || count <= 0 || !m_bIsParsed ||
       m_CharList.empty() || m_TextBuf.GetLength() == 0) {
-    return L"";
+    return WideString();
   }
 
   const int count_chars = CountChars();
@@ -484,7 +484,7 @@
   // character.
   while (text_start < 0) {
     if (start >= count_chars)
-      return L"";
+      return WideString();
     start++;
     text_start = TextIndexFromCharIndex(start);
   }
@@ -499,14 +499,14 @@
   // character.
   while (text_last < 0) {
     if (last < text_start)
-      return L"";
+      return WideString();
 
     last--;
     text_last = TextIndexFromCharIndex(last);
   }
 
   if (text_last < text_start)
-    return L"";
+    return WideString();
 
   int text_count = text_last - text_start + 1;
 
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index 0ddbcd9..a58a5c9 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -296,7 +296,7 @@
     va_end(argListCopy);
 
     if (!guess.has_value())
-      return L"";
+      return WideString();
     maxLen = pdfium::base::checked_cast<int>(guess.value());
   }
 
@@ -310,7 +310,7 @@
       return *ret;
     maxLen *= 2;
   }
-  return L"";
+  return WideString();
 }
 
 // static
diff --git a/core/fxcrt/xml/cfx_xmlelement.cpp b/core/fxcrt/xml/cfx_xmlelement.cpp
index 02b3fcc..e09fc57 100644
--- a/core/fxcrt/xml/cfx_xmlelement.cpp
+++ b/core/fxcrt/xml/cfx_xmlelement.cpp
@@ -68,7 +68,7 @@
     }
     return pElement->GetAttribute(attr);
   }
-  return L"";
+  return WideString();
 }
 
 WideString CFX_XMLElement::GetTextData() const {
@@ -137,7 +137,7 @@
 
 WideString CFX_XMLElement::GetAttribute(const WideString& name) const {
   auto it = attrs_.find(name);
-  return it != attrs_.end() ? it->second : L"";
+  return it != attrs_.end() ? it->second : WideString();
 }
 
 void CFX_XMLElement::SetAttribute(const WideString& name,
diff --git a/fpdfsdk/cpdfsdk_actionhandler.cpp b/fpdfsdk/cpdfsdk_actionhandler.cpp
index 1816c94..e543e85 100644
--- a/fpdfsdk/cpdfsdk_actionhandler.cpp
+++ b/fpdfsdk/cpdfsdk_actionhandler.cpp
@@ -128,7 +128,7 @@
     if (pFormFillEnv->IsJSPlatformPresent()) {
       WideString swJS = action.GetJavaScript();
       if (!swJS.IsEmpty())
-        RunDocumentOpenJavaScript(pFormFillEnv, L"", swJS);
+        RunDocumentOpenJavaScript(pFormFillEnv, WideString(), swJS);
     }
   } else {
     DoAction_NoJs(action, CPDF_AAction::AActionType::kDocumentOpen,
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
index 3260908..68f5a67 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
@@ -452,7 +452,7 @@
     const WideString& wsEncode,
     const WideString& wsHeader) {
   if (!m_pInfo || !m_pInfo->FFI_PostRequestURL)
-    return L"";
+    return WideString();
 
   ByteString bsURL = wsURL.ToUTF16LE();
   ByteString bsData = wsData.ToUTF16LE();
diff --git a/fpdfsdk/formfiller/cffl_combobox.cpp b/fpdfsdk/formfiller/cffl_combobox.cpp
index 0123837..efde8ce 100644
--- a/fpdfsdk/formfiller/cffl_combobox.cpp
+++ b/fpdfsdk/formfiller/cffl_combobox.cpp
@@ -142,8 +142,8 @@
           fa.sChangeEx = GetSelectExportText();
 
           if (fa.bFieldFull) {
-            fa.sChange = L"";
-            fa.sChangeEx = L"";
+            fa.sChange.clear();
+            fa.sChangeEx.clear();
           }
         }
       }
diff --git a/fpdfsdk/formfiller/cffl_listbox.cpp b/fpdfsdk/formfiller/cffl_listbox.cpp
index 0b67ab0..d64fa7c 100644
--- a/fpdfsdk/formfiller/cffl_listbox.cpp
+++ b/fpdfsdk/formfiller/cffl_listbox.cpp
@@ -146,7 +146,7 @@
   switch (type) {
     case CPDF_AAction::kValidate:
       if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) {
-        fa.sValue = L"";
+        fa.sValue.clear();
       } else {
         auto* pListBox =
             static_cast<CPWL_ListBox*>(GetPDFWindow(pPageView, false));
@@ -160,7 +160,7 @@
     case CPDF_AAction::kLoseFocus:
     case CPDF_AAction::kGetFocus:
       if (m_pWidget->GetFieldFlags() & FIELDFLAG_MULTISELECT) {
-        fa.sValue = L"";
+        fa.sValue.clear();
       } else {
         int32_t nCurSel = m_pWidget->GetSelectedIndex(0);
         if (nCurSel >= 0)
diff --git a/fpdfsdk/formfiller/cffl_textfield.cpp b/fpdfsdk/formfiller/cffl_textfield.cpp
index a591d37..fffdfbf 100644
--- a/fpdfsdk/formfiller/cffl_textfield.cpp
+++ b/fpdfsdk/formfiller/cffl_textfield.cpp
@@ -168,8 +168,8 @@
         fa.sValue = pWnd->GetText();
 
         if (fa.bFieldFull) {
-          fa.sChange = L"";
-          fa.sChangeEx = L"";
+          fa.sChange.clear();
+          fa.sChangeEx.clear();
         }
       }
       break;
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index 5a96818..43685b2 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -823,7 +823,7 @@
 
   CPDF_Stream* pStream = GetAnnotAPNoFallback(pAnnotDict, mode);
   return Utf16EncodeMaybeCopyAndReturnLength(
-      pStream ? pStream->GetUnicodeText() : L"", buffer, buflen);
+      pStream ? pStream->GetUnicodeText() : WideString(), buffer, buflen);
 }
 
 FPDF_EXPORT FPDF_ANNOTATION FPDF_CALLCONV
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
index 40ccbdc..a78ad37 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
@@ -228,15 +228,15 @@
 }
 
 WideString CPDFXFA_Context::GetAppName() {
-  return m_pFormFillEnv ? m_pFormFillEnv->FFI_GetAppName() : L"";
+  return m_pFormFillEnv ? m_pFormFillEnv->FFI_GetAppName() : WideString();
 }
 
 WideString CPDFXFA_Context::GetLanguage() {
-  return m_pFormFillEnv ? m_pFormFillEnv->GetLanguage() : L"";
+  return m_pFormFillEnv ? m_pFormFillEnv->GetLanguage() : WideString();
 }
 
 WideString CPDFXFA_Context::GetPlatform() {
-  return m_pFormFillEnv ? m_pFormFillEnv->GetPlatform() : L"";
+  return m_pFormFillEnv ? m_pFormFillEnv->GetPlatform() : WideString();
 }
 
 void CPDFXFA_Context::Beep(uint32_t dwType) {
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index 05ad437..516bcf2 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -645,7 +645,7 @@
         return false;
 
       pFormFillEnv->JS_appAlert(WideString::FromDefANSI(IDS_XFA_Validate_Input),
-                                L"", JSPLATFORM_ALERT_BUTTON_OK,
+                                WideString(), JSPLATFORM_ALERT_BUTTON_OK,
                                 JSPLATFORM_ALERT_ICON_WARNING);
       return false;
     }
@@ -880,9 +880,9 @@
       tmp = tmp.Right(tmp.GetLength() - 5);
       csMsg += tmp;
     }
-    srcURL = !pos.has_value()
-                 ? L""
-                 : srcURL.Right(csURL.GetLength() - (pos.value() + 1));
+    srcURL = pos.has_value()
+                 ? srcURL.Right(csURL.GetLength() - (pos.value() + 1))
+                 : WideString();
   }
   csToAddress.Replace(L",", L";");
   csCCAddress.Replace(L",", L";");
@@ -899,8 +899,8 @@
 
   WideString csURL = submit->GetSubmitTarget();
   if (csURL.IsEmpty()) {
-    pFormFillEnv->JS_appAlert(WideString::FromDefANSI("Submit cancelled."), L"",
-                              JSPLATFORM_ALERT_BUTTON_OK,
+    pFormFillEnv->JS_appAlert(WideString::FromDefANSI("Submit cancelled."),
+                              WideString(), JSPLATFORM_ALERT_BUTTON_OK,
                               JSPLATFORM_ALERT_ICON_ASTERISK);
     return false;
   }
diff --git a/fpdfsdk/pwl/cpwl_list_impl.cpp b/fpdfsdk/pwl/cpwl_list_impl.cpp
index b7081c0..d8a6a1d 100644
--- a/fpdfsdk/pwl/cpwl_list_impl.cpp
+++ b/fpdfsdk/pwl/cpwl_list_impl.cpp
@@ -634,5 +634,5 @@
 WideString CPWL_ListCtrl::GetItemText(int32_t nIndex) const {
   if (pdfium::IndexInBounds(m_ListItems, nIndex) && m_ListItems[nIndex])
     return m_ListItems[nIndex]->GetText();
-  return L"";
+  return WideString();
 }
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp
index 33d1087..926e731 100644
--- a/fxjs/cjs_document.cpp
+++ b/fxjs/cjs_document.cpp
@@ -64,7 +64,7 @@
 WideString GetObjWordStr(const CPDF_TextObject* pTextObj, int nWordIndex) {
   CPDF_Font* pFont = pTextObj->GetFont();
   if (!pFont)
-    return L"";
+    return WideString();
 
   WideString swRet;
   int nWords = 0;
diff --git a/fxjs/cjs_eventhandler.cpp b/fxjs/cjs_eventhandler.cpp
index 1fa19e7..ec6f9ec 100644
--- a/fxjs/cjs_eventhandler.cpp
+++ b/fxjs/cjs_eventhandler.cpp
@@ -369,11 +369,11 @@
 void CJS_EventHandler::Initialize(JS_EVENT_T type) {
   m_eEventType = type;
 
-  m_strTargetName = L"";
-  m_strSourceName = L"";
+  m_strTargetName.clear();
+  m_strSourceName.clear();
   m_pWideStrChange = nullptr;
-  m_WideStrChangeDu = L"";
-  m_WideStrChangeEx = L"";
+  m_WideStrChangeDu.clear();
+  m_WideStrChangeEx.clear();
   m_nCommitKey = -1;
   m_bKeyDown = false;
   m_bModifier = false;
diff --git a/fxjs/xfa/cjx_object.cpp b/fxjs/xfa/cjx_object.cpp
index e111fbc..cd95fd1 100644
--- a/fxjs/xfa/cjx_object.cpp
+++ b/fxjs/xfa/cjx_object.cpp
@@ -671,7 +671,7 @@
         if (ret)
           wsContentType = *ret;
         if (wsContentType.EqualsASCII("text/html")) {
-          wsContentType = L"";
+          wsContentType.clear();
           SetAttribute(XFA_Attribute::ContentType, wsContentType.AsStringView(),
                        false);
         }
diff --git a/xfa/fde/cfde_texteditengine.cpp b/xfa/fde/cfde_texteditengine.cpp
index 878c488..fd59cbc 100644
--- a/xfa/fde/cfde_texteditengine.cpp
+++ b/xfa/fde/cfde_texteditengine.cpp
@@ -790,7 +790,7 @@
 
 WideString CFDE_TextEditEngine::GetSelectedText() const {
   if (!has_selection_)
-    return L"";
+    return WideString();
 
   WideString text;
   if (selection_.start_idx < gap_position_) {
@@ -824,7 +824,7 @@
 WideString CFDE_TextEditEngine::DeleteSelectedText(
     RecordOperation add_operation) {
   if (!has_selection_)
-    return L"";
+    return WideString();
 
   return Delete(selection_.start_idx, selection_.count, add_operation);
 }
@@ -833,10 +833,10 @@
                                        size_t length,
                                        RecordOperation add_operation) {
   if (start_idx >= text_length_)
-    return L"";
+    return WideString();
 
   TextChange change;
-  change.text = L"";
+  change.text.clear();
   change.cancelled = false;
   if (delegate_ && (add_operation != RecordOperation::kSkipRecord &&
                     add_operation != RecordOperation::kSkipNotify)) {
@@ -846,7 +846,7 @@
 
     delegate_->OnTextWillChange(&change);
     if (change.cancelled)
-      return L"";
+      return WideString();
 
     start_idx = change.selection_start;
     length = change.selection_end - change.selection_start;
diff --git a/xfa/fwl/cfwl_combobox.cpp b/xfa/fwl/cfwl_combobox.cpp
index 1bd1799..b4a79fe 100644
--- a/xfa/fwl/cfwl_combobox.cpp
+++ b/xfa/fwl/cfwl_combobox.cpp
@@ -140,7 +140,7 @@
 WideString CFWL_ComboBox::GetTextByIndex(int32_t iIndex) const {
   CFWL_ListItem* pItem = static_cast<CFWL_ListItem*>(
       m_pListBox->GetItem(m_pListBox.get(), iIndex));
-  return pItem ? pItem->GetText() : L"";
+  return pItem ? pItem->GetText() : WideString();
 }
 
 void CFWL_ComboBox::SetCurSel(int32_t iSel) {
@@ -151,7 +151,7 @@
       m_pEdit->SetText(WideString());
     } else {
       CFWL_ListItem* hItem = m_pListBox->GetItem(this, iSel);
-      m_pEdit->SetText(hItem ? hItem->GetText() : L"");
+      m_pEdit->SetText(hItem ? hItem->GetText() : WideString());
     }
     m_pEdit->Update();
   }
@@ -186,10 +186,10 @@
   if (m_pEdit)
     return m_pEdit->GetText();
   if (!m_pListBox)
-    return L"";
+    return WideString();
 
   CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
-  return hItem ? hItem->GetText() : L"";
+  return hItem ? hItem->GetText() : WideString();
 }
 
 void CFWL_ComboBox::OpenDropDownList(bool bActivate) {
@@ -283,7 +283,7 @@
 
 void CFWL_ComboBox::SyncEditText(int32_t iListItem) {
   CFWL_ListItem* hItem = m_pListBox->GetItem(this, iListItem);
-  m_pEdit->SetText(hItem ? hItem->GetText() : L"");
+  m_pEdit->SetText(hItem ? hItem->GetText() : WideString());
   m_pEdit->Update();
   m_pEdit->SetSelected();
 }
@@ -319,7 +319,7 @@
   if (m_iCurSel >= 0) {
     CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
     m_pEdit->LockUpdate();
-    m_pEdit->SetText(hItem ? hItem->GetText() : L"");
+    m_pEdit->SetText(hItem ? hItem->GetText() : WideString());
     m_pEdit->UnlockUpdate();
   }
   m_pEdit->Update();
@@ -569,7 +569,7 @@
       iCurSel = pComboList->MatchItem(wsText);
       if (iCurSel >= 0) {
         CFWL_ListItem* item = m_pListBox->GetSelItem(iCurSel);
-        bMatchEqual = wsText == (item ? item->GetText() : L"");
+        bMatchEqual = wsText == (item ? item->GetText() : WideString());
       }
     }
     if (iCurSel < 0) {
diff --git a/xfa/fwl/cfwl_combolist.cpp b/xfa/fwl/cfwl_combolist.cpp
index 2083802..237cc20 100644
--- a/xfa/fwl/cfwl_combolist.cpp
+++ b/xfa/fwl/cfwl_combolist.cpp
@@ -31,7 +31,7 @@
   int32_t iCount = CountItems(this);
   for (int32_t i = 0; i < iCount; i++) {
     CFWL_ListItem* hItem = GetItem(this, i);
-    WideString wsText = hItem ? hItem->GetText() : L"";
+    WideString wsText = hItem ? hItem->GetText() : WideString();
     auto pos = wsText.Find(wsMatch.c_str());
     if (pos.has_value() && pos.value() == 0)
       return i;
diff --git a/xfa/fwl/cfwl_datetimepicker.cpp b/xfa/fwl/cfwl_datetimepicker.cpp
index 9666f36..c3e327c 100644
--- a/xfa/fwl/cfwl_datetimepicker.cpp
+++ b/xfa/fwl/cfwl_datetimepicker.cpp
@@ -175,7 +175,7 @@
 }
 
 WideString CFWL_DateTimePicker::GetEditText() const {
-  return m_pEdit ? m_pEdit->GetText() : L"";
+  return m_pEdit ? m_pEdit->GetText() : WideString();
 }
 
 int32_t CFWL_DateTimePicker::GetEditTextLength() const {
diff --git a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
index 61035c5..3027dea 100644
--- a/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmexpression.cpp
@@ -21,7 +21,7 @@
 
 WideString IdentifierToName(WideStringView ident) {
   if (ident.IsEmpty())
-    return L"";
+    return WideString();
   if (ident[0] != L'!')
     return WideString(ident);
   return L"pfm__excl__" + ident.Right(ident.GetLength() - 1);
diff --git a/xfa/fxfa/fm2js/cxfa_fmparser.cpp b/xfa/fxfa/fm2js/cxfa_fmparser.cpp
index 8bb029e..1de6a04 100644
--- a/xfa/fxfa/fm2js/cxfa_fmparser.cpp
+++ b/xfa/fxfa/fm2js/cxfa_fmparser.cpp
@@ -719,7 +719,7 @@
           return nullptr;
 
         expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-            std::move(expr), TOKcall, L"", std::move(s));
+            std::move(expr), TOKcall, WideStringView(), std::move(s));
         break;
       }
       case TOKdot: {
@@ -753,7 +753,7 @@
             return nullptr;
 
           expr = pdfium::MakeUnique<CXFA_FMDotAccessorExpression>(
-              std::move(expr), TOKcall, L"", std::move(s));
+              std::move(expr), TOKcall, WideStringView(), std::move(s));
         } else if (m_token.m_type == TOKlbracket) {
           std::unique_ptr<CXFA_FMSimpleExpression> s = ParseIndexExpression();
           if (!s)
diff --git a/xfa/fxfa/parser/cxfa_bind.cpp b/xfa/fxfa/parser/cxfa_bind.cpp
index 6ae84ae..411a3d6 100644
--- a/xfa/fxfa/parser/cxfa_bind.cpp
+++ b/xfa/fxfa/parser/cxfa_bind.cpp
@@ -50,5 +50,5 @@
 WideString CXFA_Bind::GetPicture() {
   CXFA_Picture* pPicture =
       GetChild<CXFA_Picture>(0, XFA_Element::Picture, false);
-  return pPicture ? pPicture->JSObject()->GetContent(false) : L"";
+  return pPicture ? pPicture->JSObject()->GetContent(false) : WideString();
 }
diff --git a/xfa/fxfa/parser/cxfa_calculate.cpp b/xfa/fxfa/parser/cxfa_calculate.cpp
index a5540df..5054e67 100644
--- a/xfa/fxfa/parser/cxfa_calculate.cpp
+++ b/xfa/fxfa/parser/cxfa_calculate.cpp
@@ -57,8 +57,8 @@
 WideString CXFA_Calculate::GetMessageText() {
   CXFA_Message* pNode = GetChild<CXFA_Message>(0, XFA_Element::Message, false);
   if (!pNode)
-    return L"";
+    return WideString();
 
   CXFA_Text* text = pNode->GetChild<CXFA_Text>(0, XFA_Element::Text, false);
-  return text ? text->GetContent() : L"";
+  return text ? text->GetContent() : WideString();
 }
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 37eee55..d1deb0d 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -523,7 +523,7 @@
         break;
       }
       case XFA_FFWidgetType::kChoiceList:
-        wsValue = defValue ? defValue->GetChildValueContent() : L"";
+        wsValue = defValue ? defValue->GetChildValueContent() : WideString();
         if (pFormNode->IsChoiceListMultiSelect()) {
           std::vector<WideString> wsSelTextArray =
               pFormNode->GetSelectedItemsValue();
@@ -549,7 +549,7 @@
         }
         break;
       case XFA_FFWidgetType::kCheckButton:
-        wsValue = defValue ? defValue->GetChildValueContent() : L"";
+        wsValue = defValue ? defValue->GetChildValueContent() : WideString();
         if (wsValue.IsEmpty())
           break;
 
@@ -619,7 +619,7 @@
         break;
       }
       case XFA_FFWidgetType::kNumericEdit: {
-        wsValue = defValue ? defValue->GetChildValueContent() : L"";
+        wsValue = defValue ? defValue->GetChildValueContent() : WideString();
         if (wsValue.IsEmpty())
           break;
 
@@ -633,7 +633,7 @@
         break;
       }
       default:
-        wsValue = defValue ? defValue->GetChildValueContent() : L"";
+        wsValue = defValue ? defValue->GetChildValueContent() : WideString();
         if (wsValue.IsEmpty())
           break;
 
@@ -1198,7 +1198,7 @@
           WideString wsRef =
               pTemplateNodeBind
                   ? pTemplateNodeBind->JSObject()->GetCData(XFA_Attribute::Ref)
-                  : L"";
+                  : WideString();
           uint32_t dFlags =
               XFA_RESOLVENODE_Children | XFA_RESOLVENODE_CreateNode;
           XFA_RESOLVENODE_RS rs;
diff --git a/xfa/fxfa/parser/cxfa_document_parser.cpp b/xfa/fxfa/parser/cxfa_document_parser.cpp
index 57a6e90..8a2ca46 100644
--- a/xfa/fxfa/parser/cxfa_document_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_document_parser.cpp
@@ -265,7 +265,7 @@
 
 WideString GetPlainTextFromRichText(CFX_XMLNode* pXMLNode) {
   if (!pXMLNode)
-    return L"";
+    return WideString();
 
   WideString wsPlainText;
   switch (pXMLNode->GetType()) {
@@ -1070,7 +1070,8 @@
         if (!pXFAChild)
           return;
 
-        pXFAChild->JSObject()->SetCData(XFA_Attribute::Name, L"", false, false);
+        pXFAChild->JSObject()->SetCData(XFA_Attribute::Name, WideString(),
+                                        false, false);
         pXFAChild->JSObject()->SetCData(XFA_Attribute::Value, wsCurValue, false,
                                         false);
         pXFANode->InsertChild(pXFAChild, nullptr);
@@ -1107,7 +1108,8 @@
         if (!pXFAChild)
           return;
 
-        pXFAChild->JSObject()->SetCData(XFA_Attribute::Name, L"", false, false);
+        pXFAChild->JSObject()->SetCData(XFA_Attribute::Name, WideString(),
+                                        false, false);
         pXFAChild->JSObject()->SetCData(XFA_Attribute::Value, wsCurValue, false,
                                         false);
         pXFANode->InsertChild(pXFAChild, nullptr);
diff --git a/xfa/fxfa/parser/cxfa_localemgr.cpp b/xfa/fxfa/parser/cxfa_localemgr.cpp
index fc3b1ce..fbfc560 100644
--- a/xfa/fxfa/parser/cxfa_localemgr.cpp
+++ b/xfa/fxfa/parser/cxfa_localemgr.cpp
@@ -1225,7 +1225,7 @@
     return m_wsConfigLocale;
 
   m_hasSetLocaleName = true;
-  m_wsConfigLocale = L"";
+  m_wsConfigLocale.clear();
   if (!pConfig)
     return m_wsConfigLocale;
 
diff --git a/xfa/fxfa/parser/cxfa_localevalue.cpp b/xfa/fxfa/parser/cxfa_localevalue.cpp
index 1529a48..9b2a69e 100644
--- a/xfa/fxfa/parser/cxfa_localevalue.cpp
+++ b/xfa/fxfa/parser/cxfa_localevalue.cpp
@@ -46,8 +46,8 @@
 bool ValueSplitDateTime(const WideString& wsDateTime,
                         WideString& wsDate,
                         WideString& wsTime) {
-  wsDate = L"";
-  wsTime = L"";
+  wsDate.clear();
+  wsTime.clear();
   if (wsDateTime.IsEmpty())
     return false;
 
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 312568b..b7a2852 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -241,8 +241,8 @@
 bool SplitDateTime(const WideString& wsDateTime,
                    WideString& wsDate,
                    WideString& wsTime) {
-  wsDate = L"";
-  wsTime = L"";
+  wsDate.clear();
+  wsTime.clear();
   if (wsDateTime.IsEmpty())
     return false;
 
@@ -371,7 +371,7 @@
 
 WideString FormatNumStr(const WideString& wsValue, LocaleIface* pLocale) {
   if (wsValue.IsEmpty())
-    return L"";
+    return WideString();
 
   WideString wsSrcNum = wsValue;
   WideString wsGroupSymbol = pLocale->GetGroupingSymbol();
@@ -385,7 +385,7 @@
   dot_index = !dot_index.has_value() ? wsSrcNum.GetLength() : dot_index;
 
   if (dot_index.value() < 1)
-    return L"";
+    return WideString();
 
   size_t nPos = dot_index.value() % 3;
   WideString wsOutput;
@@ -4174,11 +4174,11 @@
     iCount++;
   }
   if (iSearch < 0)
-    return L"";
+    return WideString();
 
   CXFA_Node* pText =
       pSaveItems->GetChild<CXFA_Node>(iSearch, XFA_Element::Unknown, false);
-  return pText ? pText->JSObject()->GetContent(false) : L"";
+  return pText ? pText->JSObject()->GetContent(false) : WideString();
 }
 
 bool CXFA_Node::DeleteItem(int32_t nIndex, bool bNotify, bool bScriptModify) {
@@ -4345,7 +4345,7 @@
 
 WideString CXFA_Node::GetPictureContent(XFA_VALUEPICTURE ePicture) {
   if (ePicture == XFA_VALUEPICTURE_Raw)
-    return L"";
+    return WideString();
 
   CXFA_LocaleValue widgetValue = XFA_GetLocaleValue(this);
   switch (ePicture) {
@@ -4363,7 +4363,7 @@
 
       LocaleIface* pLocale = GetLocale();
       if (!pLocale)
-        return L"";
+        return WideString();
 
       uint32_t dwType = widgetValue.GetType();
       switch (dwType) {
@@ -4378,7 +4378,7 @@
         case XFA_VT_DECIMAL:
         case XFA_VT_FLOAT:
         default:
-          return L"";
+          return WideString();
       }
     }
     case XFA_VALUEPICTURE_Edit: {
@@ -4395,7 +4395,7 @@
 
       LocaleIface* pLocale = GetLocale();
       if (!pLocale)
-        return L"";
+        return WideString();
 
       uint32_t dwType = widgetValue.GetType();
       switch (dwType) {
@@ -4408,7 +4408,7 @@
                  L"T" +
                  pLocale->GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY_Short);
         default:
-          return L"";
+          return WideString();
       }
     }
     case XFA_VALUEPICTURE_DataBind: {
@@ -4420,7 +4420,7 @@
     default:
       break;
   }
-  return L"";
+  return WideString();
 }
 
 WideString CXFA_Node::GetValue(XFA_VALUEPICTURE eValueType) {
@@ -4439,7 +4439,8 @@
       if (eValueType == XFA_VALUEPICTURE_Display) {
         int32_t iSelItemIndex = GetSelectedItem(0);
         if (iSelItemIndex >= 0) {
-          wsValue = GetChoiceListItem(iSelItemIndex, false).value_or(L"");
+          wsValue =
+              GetChoiceListItem(iSelItemIndex, false).value_or(WideString());
           wsPicture.clear();
         }
       }
@@ -4490,7 +4491,7 @@
 
 WideString CXFA_Node::GetNormalizeDataValue(const WideString& wsValue) {
   if (wsValue.IsEmpty())
-    return L"";
+    return WideString();
 
   WideString wsPicture = GetPictureContent(XFA_VALUEPICTURE_DataBind);
   if (wsPicture.IsEmpty())
@@ -4509,7 +4510,7 @@
 
 WideString CXFA_Node::GetFormatDataValue(const WideString& wsValue) {
   if (wsValue.IsEmpty())
-    return L"";
+    return WideString();
 
   WideString wsPicture = GetPictureContent(XFA_VALUEPICTURE_DataBind);
   if (wsPicture.IsEmpty())
@@ -4591,7 +4592,7 @@
 
 WideString CXFA_Node::NormalizeNumStr(const WideString& wsValue) {
   if (wsValue.IsEmpty())
-    return L"";
+    return WideString();
 
   WideString wsOutput = wsValue;
   wsOutput.TrimLeft('0');
diff --git a/xfa/fxfa/parser/cxfa_validate.cpp b/xfa/fxfa/parser/cxfa_validate.cpp
index 4f76f84..f5776a4 100644
--- a/xfa/fxfa/parser/cxfa_validate.cpp
+++ b/xfa/fxfa/parser/cxfa_validate.cpp
@@ -79,7 +79,7 @@
   CXFA_Message* pNode =
       JSObject()->GetProperty<CXFA_Message>(0, XFA_Element::Message);
   if (!pNode)
-    return L"";
+    return WideString();
 
   for (CXFA_Node* pItemNode = pNode->GetFirstChild(); pItemNode;
        pItemNode = pItemNode->GetNextSibling()) {
@@ -90,7 +90,7 @@
     if (wsName.IsEmpty() || wsName == wsMessageType)
       return pItemNode->JSObject()->GetContent(false);
   }
-  return L"";
+  return WideString();
 }
 
 void CXFA_Validate::SetFormatMessageText(const WideString& wsMessage) {
@@ -146,7 +146,7 @@
 
 WideString CXFA_Validate::GetPicture() {
   CXFA_Picture* pNode = GetChild<CXFA_Picture>(0, XFA_Element::Picture, false);
-  return pNode ? pNode->JSObject()->GetContent(false) : L"";
+  return pNode ? pNode->JSObject()->GetContent(false) : WideString();
 }
 
 CXFA_Script* CXFA_Validate::GetScriptIfExists() {
diff --git a/xfa/fxfa/parser/cxfa_value.cpp b/xfa/fxfa/parser/cxfa_value.cpp
index 24bd338..b06eebf 100644
--- a/xfa/fxfa/parser/cxfa_value.cpp
+++ b/xfa/fxfa/parser/cxfa_value.cpp
@@ -64,7 +64,9 @@
 
 WideString CXFA_Value::GetChildValueContent() const {
   CXFA_Node* pNode = GetFirstChild();
-  return pNode ? pNode->JSObject()->TryContent(false, true).value_or(L"") : L"";
+  return pNode
+             ? pNode->JSObject()->TryContent(false, true).value_or(WideString())
+             : WideString();
 }
 
 CXFA_Arc* CXFA_Value::GetArcIfExists() const {
diff --git a/xfa/fxfa/parser/cxfa_xmllocale.cpp b/xfa/fxfa/parser/cxfa_xmllocale.cpp
index 4658c75..0b7da69 100644
--- a/xfa/fxfa/parser/cxfa_xmllocale.cpp
+++ b/xfa/fxfa/parser/cxfa_xmllocale.cpp
@@ -68,32 +68,37 @@
 
 WideString CXFA_XMLLocale::GetDecimalSymbol() const {
   CFX_XMLElement* patterns = locale_->GetFirstChildNamed(kNumberSymbols);
-  return patterns ? GetPattern(patterns, kNumberSymbol, L"decimal") : L"";
+  return patterns ? GetPattern(patterns, kNumberSymbol, L"decimal")
+                  : WideString();
 }
 
 WideString CXFA_XMLLocale::GetGroupingSymbol() const {
   CFX_XMLElement* patterns = locale_->GetFirstChildNamed(kNumberSymbols);
-  return patterns ? GetPattern(patterns, kNumberSymbol, L"grouping") : L"";
+  return patterns ? GetPattern(patterns, kNumberSymbol, L"grouping")
+                  : WideString();
 }
 
 WideString CXFA_XMLLocale::GetPercentSymbol() const {
   CFX_XMLElement* patterns = locale_->GetFirstChildNamed(kNumberSymbols);
-  return patterns ? GetPattern(patterns, kNumberSymbol, L"percent") : L"";
+  return patterns ? GetPattern(patterns, kNumberSymbol, L"percent")
+                  : WideString();
 }
 
 WideString CXFA_XMLLocale::GetMinusSymbol() const {
   CFX_XMLElement* patterns = locale_->GetFirstChildNamed(kNumberSymbols);
-  return patterns ? GetPattern(patterns, kNumberSymbol, L"minus") : L"";
+  return patterns ? GetPattern(patterns, kNumberSymbol, L"minus")
+                  : WideString();
 }
 
 WideString CXFA_XMLLocale::GetCurrencySymbol() const {
   CFX_XMLElement* patterns = locale_->GetFirstChildNamed(kCurrencySymbols);
-  return patterns ? GetPattern(patterns, kCurrencySymbol, L"symbol") : L"";
+  return patterns ? GetPattern(patterns, kCurrencySymbol, L"symbol")
+                  : WideString();
 }
 
 WideString CXFA_XMLLocale::GetDateTimeSymbols() const {
   CFX_XMLElement* symbols = locale_->GetFirstChildNamed(L"dateTimeSymbols");
-  return symbols ? symbols->GetTextData() : L"";
+  return symbols ? symbols->GetTextData() : WideString();
 }
 
 WideString CXFA_XMLLocale::GetMonthName(int32_t nMonth, bool bAbbr) const {
@@ -121,7 +126,7 @@
                                              bool bAbbr) const {
   CFX_XMLElement* child = locale_->GetFirstChildNamed(L"calendarSymbols");
   if (!child)
-    return L"";
+    return WideString();
 
   WideString pstrSymbolNames = symbol + L"Names";
   CFX_XMLElement* name_child = nullptr;
@@ -142,17 +147,17 @@
     break;
   }
   if (!name_child)
-    return L"";
+    return WideString();
 
   CFX_XMLElement* sym_element = name_child->GetNthChildNamed(symbol, index);
-  return sym_element ? sym_element->GetTextData() : L"";
+  return sym_element ? sym_element->GetTextData() : WideString();
 }
 
 WideString CXFA_XMLLocale::GetDatePattern(
     FX_LOCALEDATETIMESUBCATEGORY eType) const {
   CFX_XMLElement* patterns = locale_->GetFirstChildNamed(L"datePatterns");
   if (!patterns)
-    return L"";
+    return WideString();
 
   WideString wsName;
   switch (eType) {
@@ -177,7 +182,7 @@
     FX_LOCALEDATETIMESUBCATEGORY eType) const {
   CFX_XMLElement* patterns = locale_->GetFirstChildNamed(L"timePatterns");
   if (!patterns)
-    return L"";
+    return WideString();
 
   WideString wsName;
   switch (eType) {
@@ -200,7 +205,7 @@
 
 WideString CXFA_XMLLocale::GetNumPattern(FX_LOCALENUMSUBCATEGORY eType) const {
   CFX_XMLElement* patterns = locale_->GetFirstChildNamed(L"numberPatterns");
-  return patterns ? XFA_PatternToString(eType) : L"";
+  return patterns ? XFA_PatternToString(eType) : WideString();
 }
 
 WideString CXFA_XMLLocale::GetPattern(CFX_XMLElement* patterns,
@@ -214,5 +219,5 @@
       return pattern->GetTextData();
     }
   }
-  return L"";
+  return WideString();
 }
