diff --git a/core/fxcrt/bytestring.cpp b/core/fxcrt/bytestring.cpp
index 40b41b0..5155309 100644
--- a/core/fxcrt/bytestring.cpp
+++ b/core/fxcrt/bytestring.cpp
@@ -477,24 +477,13 @@
 }
 
 ByteString ByteString::Substr(size_t first, size_t count) const {
-  if (!m_pData)
+  if (!m_pData) {
     return ByteString();
-
-  if (!IsValidIndex(first))
-    return ByteString();
-
-  if (count == 0 || !IsValidLength(count))
-    return ByteString();
-
-  if (!IsValidIndex(first + count - 1))
-    return ByteString();
-
-  if (first == 0 && count == m_pData->m_nDataLength)
+  }
+  if (first == 0 && count == m_pData->m_nDataLength) {
     return *this;
-
-  ByteString dest;
-  AllocCopy(dest, count, first);
-  return dest;
+  }
+  return ByteString(AsStringView().Substr(first, count));
 }
 
 ByteString ByteString::First(size_t count) const {
@@ -506,17 +495,6 @@
   return Substr(GetLength() - count, count);
 }
 
-void ByteString::AllocCopy(ByteString& dest,
-                           size_t nCopyLen,
-                           size_t nCopyIndex) const {
-  if (nCopyLen == 0)
-    return;
-
-  RetainPtr<StringData> pNewData(
-      StringData::Create(m_pData->m_String + nCopyIndex, nCopyLen));
-  dest.m_pData.Swap(pNewData);
-}
-
 void ByteString::SetAt(size_t index, char c) {
   DCHECK(IsValidIndex(index));
   ReallocBeforeWrite(m_pData->m_nDataLength);
diff --git a/core/fxcrt/bytestring.h b/core/fxcrt/bytestring.h
index 6986674..9d37f4e 100644
--- a/core/fxcrt/bytestring.h
+++ b/core/fxcrt/bytestring.h
@@ -217,7 +217,6 @@
 
   void ReallocBeforeWrite(size_t nNewLen);
   void AllocBeforeWrite(size_t nNewLen);
-  void AllocCopy(ByteString& dest, size_t nCopyLen, size_t nCopyIndex) const;
   void AssignCopy(const char* pSrcData, size_t nSrcLen);
   void Concat(const char* pSrcData, size_t nSrcLen);
   intptr_t ReferenceCountForTesting() const;
diff --git a/core/fxcrt/widestring.cpp b/core/fxcrt/widestring.cpp
index 132393f..2c83fad 100644
--- a/core/fxcrt/widestring.cpp
+++ b/core/fxcrt/widestring.cpp
@@ -796,24 +796,13 @@
 }
 
 WideString WideString::Substr(size_t first, size_t count) const {
-  if (!m_pData)
+  if (!m_pData) {
     return WideString();
-
-  if (!IsValidIndex(first))
-    return WideString();
-
-  if (count == 0 || !IsValidLength(count))
-    return WideString();
-
-  if (!IsValidIndex(first + count - 1))
-    return WideString();
-
-  if (first == 0 && count == GetLength())
+  }
+  if (first == 0 && count == GetLength()) {
     return *this;
-
-  WideString dest;
-  AllocCopy(dest, count, first);
-  return dest;
+  }
+  return WideString(AsStringView().Substr(first, count));
 }
 
 WideString WideString::First(size_t count) const {
@@ -825,17 +814,6 @@
   return Substr(GetLength() - count, count);
 }
 
-void WideString::AllocCopy(WideString& dest,
-                           size_t nCopyLen,
-                           size_t nCopyIndex) const {
-  if (nCopyLen == 0)
-    return;
-
-  RetainPtr<StringData> pNewData(
-      StringData::Create(m_pData->m_String + nCopyIndex, nCopyLen));
-  dest.m_pData.Swap(pNewData);
-}
-
 size_t WideString::Insert(size_t index, wchar_t ch) {
   const size_t cur_length = GetLength();
   if (!IsValidLength(index))
diff --git a/core/fxcrt/widestring.h b/core/fxcrt/widestring.h
index 5ae355c..482eaed 100644
--- a/core/fxcrt/widestring.h
+++ b/core/fxcrt/widestring.h
@@ -238,7 +238,6 @@
 
   void ReallocBeforeWrite(size_t nNewLength);
   void AllocBeforeWrite(size_t nNewLength);
-  void AllocCopy(WideString& dest, size_t nCopyLen, size_t nCopyIndex) const;
   void AssignCopy(const wchar_t* pSrcData, size_t nSrcLen);
   void Concat(const wchar_t* pSrcData, size_t nSrcLen);
   intptr_t ReferenceCountForTesting() const;
