diff --git a/examples/producer.cpp b/examples/producer.cpp
index 80f1986..e9f7e50 100644
--- a/examples/producer.cpp
+++ b/examples/producer.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -56,10 +56,10 @@
   {
     std::cout << ">> I: " << interest << std::endl;
 
-    static const std::string content("Hello, world!");
+    constexpr std::string_view content{"Hello, world!"};
 
     // Create Data packet
-    auto data = make_shared<Data>(interest.getName());
+    auto data = std::make_shared<Data>(interest.getName());
     data->setFreshnessPeriod(10_s);
     data->setContent(make_span(reinterpret_cast<const uint8_t*>(content.data()), content.size()));
 
diff --git a/ndn-cxx/detail/common.hpp b/ndn-cxx/detail/common.hpp
index daf5f7a..631aa2f 100644
--- a/ndn-cxx/detail/common.hpp
+++ b/ndn-cxx/detail/common.hpp
@@ -56,6 +56,7 @@
 #include <memory>
 #include <stdexcept>
 #include <string>
+#include <string_view>
 #include <type_traits>
 #include <utility>
 
@@ -72,8 +73,8 @@
 using std::const_pointer_cast;
 
 using std::to_string;
-
 using namespace std::string_literals;
+using namespace std::string_view_literals;
 
 } // namespace ndn
 
diff --git a/ndn-cxx/encoding/block-helpers.cpp b/ndn-cxx/encoding/block-helpers.cpp
index c3037c8..a4b5e8d 100644
--- a/ndn-cxx/encoding/block-helpers.cpp
+++ b/ndn-cxx/encoding/block-helpers.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -28,6 +28,36 @@
 
 namespace endian = boost::endian;
 
+// ---- empty ----
+
+template<Tag TAG>
+size_t
+prependEmptyBlock(EncodingImpl<TAG>& encoder, uint32_t type)
+{
+  size_t length = encoder.prependVarNumber(0);
+  length += encoder.prependVarNumber(type);
+
+  return length;
+}
+
+template size_t
+prependEmptyBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t);
+
+template size_t
+prependEmptyBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t);
+
+Block
+makeEmptyBlock(uint32_t type)
+{
+  EncodingEstimator estimator;
+  size_t totalLength = prependEmptyBlock(estimator, type);
+
+  EncodingBuffer encoder(totalLength, 0);
+  prependEmptyBlock(encoder, type);
+
+  return encoder.block();
+}
+
 // ---- non-negative integer ----
 
 template<Tag TAG>
@@ -66,63 +96,6 @@
   return tlv::readNonNegativeInteger(block.value_size(), begin, block.value_end());
 }
 
-// ---- empty ----
-
-template<Tag TAG>
-size_t
-prependEmptyBlock(EncodingImpl<TAG>& encoder, uint32_t type)
-{
-  size_t length = encoder.prependVarNumber(0);
-  length += encoder.prependVarNumber(type);
-
-  return length;
-}
-
-template size_t
-prependEmptyBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t);
-
-template size_t
-prependEmptyBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t);
-
-Block
-makeEmptyBlock(uint32_t type)
-{
-  EncodingEstimator estimator;
-  size_t totalLength = prependEmptyBlock(estimator, type);
-
-  EncodingBuffer encoder(totalLength, 0);
-  prependEmptyBlock(encoder, type);
-
-  return encoder.block();
-}
-
-// ---- string ----
-
-template<Tag TAG>
-size_t
-prependStringBlock(EncodingImpl<TAG>& encoder, uint32_t type, const std::string& value)
-{
-  return prependBinaryBlock(encoder, type, {reinterpret_cast<const uint8_t*>(value.data()), value.size()});
-}
-
-template size_t
-prependStringBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, const std::string&);
-
-template size_t
-prependStringBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, const std::string&);
-
-Block
-makeStringBlock(uint32_t type, const std::string& value)
-{
-  return makeBinaryBlock(type, value.data(), value.size());
-}
-
-std::string
-readString(const Block& block)
-{
-  return std::string(reinterpret_cast<const char*>(block.value()), block.value_size());
-}
-
 // ---- double ----
 
 static_assert(std::numeric_limits<double>::is_iec559, "This code requires IEEE-754 doubles");
@@ -205,6 +178,27 @@
   return encoder.block();
 }
 
+// ---- string ----
+
+template<Tag TAG>
+size_t
+prependStringBlock(EncodingImpl<TAG>& encoder, uint32_t type, std::string_view value)
+{
+  return prependBinaryBlock(encoder, type, {reinterpret_cast<const uint8_t*>(value.data()), value.size()});
+}
+
+template size_t
+prependStringBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, std::string_view);
+
+template size_t
+prependStringBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, std::string_view);
+
+std::string
+readString(const Block& block)
+{
+  return std::string(reinterpret_cast<const char*>(block.value()), block.value_size());
+}
+
 // ---- block ----
 
 template<Tag TAG>
diff --git a/ndn-cxx/encoding/block-helpers.hpp b/ndn-cxx/encoding/block-helpers.hpp
index 232c2b3..fc74354 100644
--- a/ndn-cxx/encoding/block-helpers.hpp
+++ b/ndn-cxx/encoding/block-helpers.hpp
@@ -29,6 +29,30 @@
 namespace ndn {
 namespace encoding {
 
+/** @brief Prepend an empty TLV element.
+ *  @param encoder an EncodingBuffer or EncodingEstimator
+ *  @param type TLV-TYPE number
+ *  @details The TLV element has zero-length TLV-VALUE.
+ *  @sa makeEmptyBlock
+ */
+template<Tag TAG>
+size_t
+prependEmptyBlock(EncodingImpl<TAG>& encoder, uint32_t type);
+
+extern template size_t
+prependEmptyBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t);
+
+extern template size_t
+prependEmptyBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t);
+
+/** @brief Create an empty TLV block.
+ *  @param type TLV-TYPE number
+ *  @return A TLV block with zero-length TLV-VALUE
+ *  @sa prependEmptyBlock
+ */
+Block
+makeEmptyBlock(uint32_t type);
+
 /** @brief Prepend a TLV element containing a non-negative integer.
  *  @param encoder an EncodingBuffer or EncodingEstimator
  *  @param type TLV-TYPE number
@@ -93,62 +117,6 @@
   return static_cast<R>(readNonNegativeIntegerAs<std::underlying_type_t<R>>(block));
 }
 
-/** @brief Prepend an empty TLV element.
- *  @param encoder an EncodingBuffer or EncodingEstimator
- *  @param type TLV-TYPE number
- *  @details The TLV element has zero-length TLV-VALUE.
- *  @sa makeEmptyBlock
- */
-template<Tag TAG>
-size_t
-prependEmptyBlock(EncodingImpl<TAG>& encoder, uint32_t type);
-
-extern template size_t
-prependEmptyBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t);
-
-extern template size_t
-prependEmptyBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t);
-
-/** @brief Create an empty TLV block.
- *  @param type TLV-TYPE number
- *  @return A TLV block with zero-length TLV-VALUE
- *  @sa prependEmptyBlock
- */
-Block
-makeEmptyBlock(uint32_t type);
-
-/** @brief Prepend a TLV element containing a string.
- *  @param encoder an EncodingBuffer or EncodingEstimator
- *  @param type TLV-TYPE number
- *  @param value string value, may contain NUL octets
- *  @sa makeStringBlock, readString
- */
-template<Tag TAG>
-size_t
-prependStringBlock(EncodingImpl<TAG>& encoder, uint32_t type, const std::string& value);
-
-extern template size_t
-prependStringBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, const std::string&);
-
-extern template size_t
-prependStringBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, const std::string&);
-
-/** @brief Create a TLV block containing a string.
- *  @param type TLV-TYPE number
- *  @param value string value, may contain NUL octets
- *  @sa prependStringBlock, readString
- */
-Block
-makeStringBlock(uint32_t type, const std::string& value);
-
-/** @brief Read TLV-VALUE of a TLV element as a string.
- *  @param block the TLV element
- *  @return a string, may contain NUL octets
- *  @sa prependStringBlock, makeStringBlock
- */
-std::string
-readString(const Block& block);
-
 /** @brief Prepend a TLV element containing an IEEE 754 double-precision floating-point number.
  *  @param encoder an EncodingBuffer or EncodingEstimator
  *  @param type TLV-TYPE number
@@ -207,18 +175,6 @@
 Block
 makeBinaryBlock(uint32_t type, span<const uint8_t> value);
 
-/** @brief Create a TLV block copying the TLV-VALUE from a raw buffer.
- *  @param type TLV-TYPE number
- *  @param value raw buffer as TLV-VALUE
- *  @param length length of value buffer
- *  @deprecated
- */
-inline Block
-makeBinaryBlock(uint32_t type, const char* value, size_t length)
-{
-  return makeBinaryBlock(type, {reinterpret_cast<const uint8_t*>(value), length});
-}
-
 namespace detail {
 
 /**
@@ -295,6 +251,58 @@
 }
 
 /**
+ * @brief Create a TLV block copying the TLV-VALUE from a char buffer.
+ * @param type TLV-TYPE number
+ * @param value raw buffer as TLV-VALUE
+ * @param length length of value buffer
+ * @deprecated Use makeStringBlock()
+ */
+[[deprecated("use makeStringBlock")]]
+inline Block
+makeBinaryBlock(uint32_t type, const char* value, size_t length)
+{
+  return makeBinaryBlock(type, {reinterpret_cast<const uint8_t*>(value), length});
+}
+
+/**
+ * @brief Prepend a TLV element containing a string.
+ * @param encoder an EncodingBuffer or EncodingEstimator
+ * @param type TLV-TYPE number
+ * @param value string value, may contain NUL octets
+ * @sa makeStringBlock, readString
+ */
+template<Tag TAG>
+size_t
+prependStringBlock(EncodingImpl<TAG>& encoder, uint32_t type, std::string_view value);
+
+extern template size_t
+prependStringBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, std::string_view);
+
+extern template size_t
+prependStringBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, std::string_view);
+
+/**
+ * @brief Create a TLV block containing a string.
+ * @param type TLV-TYPE number
+ * @param value string value, may contain NUL octets
+ * @sa prependStringBlock, readString
+ */
+inline Block
+makeStringBlock(uint32_t type, std::string_view value)
+{
+  return makeBinaryBlock(type, {reinterpret_cast<const uint8_t*>(value.data()), value.size()});
+}
+
+/**
+ * @brief Read the TLV-VALUE of a TLV element as a string.
+ * @param block the TLV element
+ * @return a string, may contain NUL octets
+ * @sa prependStringBlock, makeStringBlock
+ */
+std::string
+readString(const Block& block);
+
+/**
  * @brief Prepend a TLV element.
  * @param encoder an EncodingBuffer or EncodingEstimator
  * @param block the TLV element
@@ -394,13 +402,13 @@
 
 } // namespace encoding
 
+using encoding::makeEmptyBlock;
 using encoding::makeNonNegativeIntegerBlock;
 using encoding::readNonNegativeInteger;
 using encoding::readNonNegativeIntegerAs;
-using encoding::makeEmptyBlock;
+using encoding::makeBinaryBlock;
 using encoding::makeStringBlock;
 using encoding::readString;
-using encoding::makeBinaryBlock;
 using encoding::makeNestedBlock;
 
 } // namespace ndn
diff --git a/ndn-cxx/encoding/nfd-constants.cpp b/ndn-cxx/encoding/nfd-constants.cpp
index 1840c36..28c842a 100644
--- a/ndn-cxx/encoding/nfd-constants.cpp
+++ b/ndn-cxx/encoding/nfd-constants.cpp
@@ -176,13 +176,13 @@
     return os << "none";
   }
 
-  static const std::map<RouteFlags, std::string> knownBits = {
-    {ROUTE_FLAG_CHILD_INHERIT, "child-inherit"},
-    {ROUTE_FLAG_CAPTURE, "capture"}
+  static const std::map<RouteFlags, std::string_view> knownBits = {
+    {ROUTE_FLAG_CHILD_INHERIT, "child-inherit"sv},
+    {ROUTE_FLAG_CAPTURE, "capture"sv}
   };
 
   auto join = make_ostream_joiner(os, '|');
-  for (const auto& [bit, token] : knownBits) {
+  for (auto [bit, token] : knownBits) {
     if ((routeFlags & bit) != 0) {
       join = token;
       routeFlags = static_cast<RouteFlags>(routeFlags & ~bit);
diff --git a/ndn-cxx/face.cpp b/ndn-cxx/face.cpp
index b73039e..f4d685c 100644
--- a/ndn-cxx/face.cpp
+++ b/ndn-cxx/face.cpp
@@ -47,8 +47,8 @@
 
 Face::OversizedPacketError::OversizedPacketError(char pktType, const Name& name, size_t wireSize)
   : Error((pktType == 'I' ? "Interest " : pktType == 'D' ? "Data " : "Nack ") +
-          name.toUri() + " encodes into " + to_string(wireSize) + " octets, "
-          "exceeding the implementation limit of " + to_string(MAX_NDN_PACKET_SIZE) + " octets")
+          name.toUri() + " encodes into " + std::to_string(wireSize) + " octets, "
+          "exceeding the implementation limit of " + std::to_string(MAX_NDN_PACKET_SIZE) + " octets")
   , pktType(pktType)
   , name(name)
   , wireSize(wireSize)
diff --git a/ndn-cxx/impl/name-component-types.hpp b/ndn-cxx/impl/name-component-types.hpp
index ca2a0ac..6f63031 100644
--- a/ndn-cxx/impl/name-component-types.hpp
+++ b/ndn-cxx/impl/name-component-types.hpp
@@ -52,10 +52,11 @@
   {
   }
 
-  /** \brief Calculate the successor of \p comp.
+  /**
+   * \brief Calculate the successor of \p comp.
    *
-   *  If \p comp is the maximum possible value of this component type, return true to indicate
-   *  that the successor should have a greater TLV-TYPE.
+   * If \p comp is the maximum possible value of this component type, return true to indicate
+   * that the successor should have a greater TLV-TYPE.
    */
   virtual std::tuple<bool, Component>
   getSuccessor(const Component& comp) const
@@ -63,7 +64,8 @@
     return {false, Component(std::get<Block>(getSuccessorImpl(comp)))};
   }
 
-  /** \brief Return the minimum allowable TLV-VALUE of this component type.
+  /**
+   * \brief Return the minimum allowable TLV-VALUE of this component type.
    */
   virtual span<const uint8_t>
   getMinValue() const
@@ -72,36 +74,39 @@
     return value;
   }
 
-  /** \brief Return the prefix of the alternate URI representation.
+  /**
+   * \brief Return the prefix of the alternate URI representation.
    *
-   *  NDN URI specification allows a name component type to declare an alternate URI representation
-   *  in the form of `<prefix>=<value>`, in addition to the plain `<type-number>=<escaped-value>`
-   *  syntax.
+   * NDN URI specification allows a name component type to declare an alternate URI representation
+   * in the form of `<prefix>=<value>`, in addition to the plain `<type-number>=<escaped-value>`
+   * syntax.
    *
-   *  \return The `<prefix>` portion of the alternate URI representation.
-   *  \retval nullptr This component does not have an alternate URI representation.
+   * \return The `<prefix>` portion of the alternate URI representation.
+   * \retval empty This component does not have an alternate URI representation.
    */
-  virtual const char*
+  virtual std::string_view
   getAltUriPrefix() const
   {
-    return nullptr;
+    return {};
   }
 
-  /** \brief Parse component from alternate URI representation.
-   *  \param input the `<value>` portion of the alternate URI representation.
-   *  \throw Component::Error
-   *  \pre getAltUriPrefix() != nullptr
+  /**
+   * \brief Parse component from alternate URI representation.
+   * \param input the `<value>` portion of the alternate URI representation.
+   * \throw Component::Error
+   * \pre `getAltUriPrefix().empty() == false`
    */
   virtual Component
-  parseAltUriValue(const std::string& input) const
+  parseAltUriValue(std::string_view input) const
   {
     NDN_CXX_UNREACHABLE;
   }
 
-  /** \brief Write URI representation of \p comp to \p os.
+  /**
+   * \brief Write URI representation of \p comp to \p os.
    *
-   *  This base class implementation encodes the component using the plain
-   *  `<type-number>=<escaped-value>` syntax (aka canonical format).
+   * This base class implementation encodes the component using the plain
+   * `<type-number>=<escaped-value>` syntax (aka canonical format).
    */
   virtual void
   writeUri(std::ostream& os, const Component& comp) const
@@ -151,7 +156,7 @@
     if (isAllPeriods) {
       os << "...";
     }
-    escape(os, reinterpret_cast<const char*>(comp.value()), comp.value_size());
+    escape(os, {reinterpret_cast<const char*>(comp.value()), comp.value_size()});
   }
 };
 
@@ -178,7 +183,8 @@
 class Sha256ComponentType final : public ComponentType
 {
 public:
-  Sha256ComponentType(uint32_t type, const std::string& typeName, const std::string& uriPrefix)
+  constexpr
+  Sha256ComponentType(uint32_t type, std::string_view typeName, std::string_view uriPrefix)
     : m_type(type)
     , m_typeName(typeName)
     , m_uriPrefix(uriPrefix)
@@ -190,7 +196,8 @@
   {
     BOOST_ASSERT(comp.type() == m_type);
     if (comp.value_size() != util::Sha256::DIGEST_SIZE) {
-      NDN_THROW(Error(m_typeName + " TLV-LENGTH must be " + to_string(util::Sha256::DIGEST_SIZE)));
+      NDN_THROW(Error(std::string(m_typeName) + " TLV-LENGTH must be " +
+                      std::to_string(util::Sha256::DIGEST_SIZE)));
     }
   }
 
@@ -208,21 +215,21 @@
     return value;
   }
 
-  const char*
+  std::string_view
   getAltUriPrefix() const final
   {
-    return m_uriPrefix.data();
+    return m_uriPrefix;
   }
 
   Component
-  parseAltUriValue(const std::string& input) const final
+  parseAltUriValue(std::string_view input) const final
   {
     shared_ptr<Buffer> value;
     try {
       value = fromHex(input);
     }
     catch (const StringHelperError&) {
-      NDN_THROW(Error("Cannot convert to " + m_typeName + " (invalid hex encoding)"));
+      NDN_THROW(Error("Cannot convert to " + std::string(m_typeName) + " (invalid hex encoding)"));
     }
     return {m_type, std::move(value)};
   }
@@ -236,8 +243,8 @@
 
 private:
   const uint32_t m_type;
-  const std::string m_typeName;
-  const std::string m_uriPrefix;
+  const std::string_view m_typeName;
+  const std::string_view m_uriPrefix;
 };
 
 /**
@@ -247,7 +254,8 @@
 class DecimalComponentType final : public ComponentType
 {
 public:
-  DecimalComponentType(uint32_t type, const std::string& typeName, const std::string& uriPrefix)
+  constexpr
+  DecimalComponentType(uint32_t type, std::string_view typeName, std::string_view uriPrefix)
     : m_type(type)
     , m_typeName(typeName)
     , m_uriPrefix(uriPrefix)
@@ -259,27 +267,27 @@
   // NonNegativeInteger, because the application may be using the same typed component
   // with different syntax and semantics.
 
-  const char*
+  std::string_view
   getAltUriPrefix() const final
   {
-    return m_uriPrefix.data();
+    return m_uriPrefix;
   }
 
   Component
-  parseAltUriValue(const std::string& input) const final
+  parseAltUriValue(std::string_view input) const final
   {
     uint64_t n = 0;
     try {
-      n = std::stoull(input);
+      n = std::stoull(std::string(input));
     }
     catch (const std::invalid_argument&) {
-      NDN_THROW(Error("Cannot convert to " + m_typeName + " (invalid format)"));
+      NDN_THROW(Error("Cannot convert to " + std::string(m_typeName) + " (invalid format)"));
     }
     catch (const std::out_of_range&) {
-      NDN_THROW(Error("Cannot convert to " + m_typeName + " (out of range)"));
+      NDN_THROW(Error("Cannot convert to " + std::string(m_typeName) + " (out of range)"));
     }
-    if (to_string(n) != input) {
-      NDN_THROW(Error("Cannot convert to " + m_typeName + " (invalid format)"));
+    if (std::to_string(n) != input) {
+      NDN_THROW(Error("Cannot convert to " + std::string(m_typeName) + " (invalid format)"));
     }
     return Component::fromNumber(n, m_type);
   }
@@ -297,8 +305,8 @@
 
 private:
   const uint32_t m_type;
-  const std::string m_typeName;
-  const std::string m_uriPrefix;
+  const std::string_view m_typeName;
+  const std::string_view m_uriPrefix;
 };
 
 /**
@@ -325,7 +333,7 @@
    * \brief Retrieve a ComponentType by its alternate URI prefix.
    */
   const ComponentType*
-  findByUriPrefix(const std::string& prefix) const
+  findByUriPrefix(std::string_view prefix) const
   {
     if (auto it = m_uriPrefixes.find(prefix); it != m_uriPrefixes.end()) {
       return it->second;
@@ -338,7 +346,7 @@
   set(uint32_t type, const ComponentType& ct)
   {
     m_table.at(type) = &ct;
-    if (ct.getAltUriPrefix() != nullptr) {
+    if (!ct.getAltUriPrefix().empty()) {
       m_uriPrefixes[ct.getAltUriPrefix()] = &ct;
     }
   }
@@ -346,7 +354,7 @@
 private:
   const ComponentType m_baseType;
   std::array<const ComponentType*, 60> m_table;
-  std::unordered_map<std::string, const ComponentType*> m_uriPrefixes;
+  std::unordered_map<std::string_view, const ComponentType*> m_uriPrefixes;
 };
 
 inline
@@ -355,10 +363,10 @@
   m_table.fill(nullptr);
 
   static const Sha256ComponentType ct1(tlv::ImplicitSha256DigestComponent,
-                                       "ImplicitSha256DigestComponent", "sha256digest");
+                                       "ImplicitSha256DigestComponent"sv, "sha256digest"sv);
   set(tlv::ImplicitSha256DigestComponent, ct1);
   static const Sha256ComponentType ct2(tlv::ParametersSha256DigestComponent,
-                                       "ParametersSha256DigestComponent", "params-sha256");
+                                       "ParametersSha256DigestComponent"sv, "params-sha256"sv);
   set(tlv::ParametersSha256DigestComponent, ct2);
 
   static const GenericNameComponentType ct8;
@@ -367,15 +375,15 @@
   static const ComponentType ct32;
   set(tlv::KeywordNameComponent, ct32);
 
-  static const DecimalComponentType ct50(tlv::SegmentNameComponent, "SegmentNameComponent", "seg");
+  static const DecimalComponentType ct50(tlv::SegmentNameComponent, "SegmentNameComponent"sv, "seg"sv);
   set(tlv::SegmentNameComponent, ct50);
-  static const DecimalComponentType ct52(tlv::ByteOffsetNameComponent, "ByteOffsetNameComponent", "off");
+  static const DecimalComponentType ct52(tlv::ByteOffsetNameComponent, "ByteOffsetNameComponent"sv, "off"sv);
   set(tlv::ByteOffsetNameComponent, ct52);
-  static const DecimalComponentType ct54(tlv::VersionNameComponent, "VersionNameComponent", "v");
+  static const DecimalComponentType ct54(tlv::VersionNameComponent, "VersionNameComponent"sv, "v"sv);
   set(tlv::VersionNameComponent, ct54);
-  static const DecimalComponentType ct56(tlv::TimestampNameComponent, "TimestampNameComponent", "t");
+  static const DecimalComponentType ct56(tlv::TimestampNameComponent, "TimestampNameComponent"sv, "t"sv);
   set(tlv::TimestampNameComponent, ct56);
-  static const DecimalComponentType ct58(tlv::SequenceNumNameComponent, "SequenceNumNameComponent", "seq");
+  static const DecimalComponentType ct58(tlv::SequenceNumNameComponent, "SequenceNumNameComponent"sv, "seq"sv);
   set(tlv::SequenceNumNameComponent, ct58);
 }
 
diff --git a/ndn-cxx/mgmt/nfd/channel-status.cpp b/ndn-cxx/mgmt/nfd/channel-status.cpp
index 32d69a1..98e72fc 100644
--- a/ndn-cxx/mgmt/nfd/channel-status.cpp
+++ b/ndn-cxx/mgmt/nfd/channel-status.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2019 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -86,7 +86,7 @@
 }
 
 ChannelStatus&
-ChannelStatus::setLocalUri(const std::string localUri)
+ChannelStatus::setLocalUri(const std::string& localUri)
 {
   m_wire.reset();
   m_localUri = localUri;
diff --git a/ndn-cxx/mgmt/nfd/channel-status.hpp b/ndn-cxx/mgmt/nfd/channel-status.hpp
index 2373ef5..4fbc06b 100644
--- a/ndn-cxx/mgmt/nfd/channel-status.hpp
+++ b/ndn-cxx/mgmt/nfd/channel-status.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -64,7 +64,7 @@
   }
 
   ChannelStatus&
-  setLocalUri(const std::string localUri);
+  setLocalUri(const std::string& localUri);
 
 private:
   std::string m_localUri;
diff --git a/ndn-cxx/mgmt/nfd/control-command.cpp b/ndn-cxx/mgmt/nfd/control-command.cpp
index cc6fa13..a6daa76 100644
--- a/ndn-cxx/mgmt/nfd/control-command.cpp
+++ b/ndn-cxx/mgmt/nfd/control-command.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -39,7 +39,7 @@
 }
 
 void
-ControlCommand::applyDefaultsToRequest(ControlParameters& parameters) const
+ControlCommand::applyDefaultsToRequest(ControlParameters&) const
 {
 }
 
@@ -50,7 +50,7 @@
 }
 
 void
-ControlCommand::applyDefaultsToResponse(ControlParameters& parameters) const
+ControlCommand::applyDefaultsToResponse(ControlParameters&) const
 {
 }
 
@@ -81,11 +81,11 @@
     bool isPresent = presentFields[i];
     if (m_required[i]) {
       if (!isPresent) {
-        NDN_THROW(ArgumentError(CONTROL_PARAMETER_FIELD[i] + " is required but missing"));
+        NDN_THROW(ArgumentError(std::string(CONTROL_PARAMETER_FIELD[i]) + " is required but missing"));
       }
     }
     else if (isPresent && !m_optional[i]) {
-      NDN_THROW(ArgumentError(CONTROL_PARAMETER_FIELD[i] + " is forbidden but present"));
+      NDN_THROW(ArgumentError(std::string(CONTROL_PARAMETER_FIELD[i]) + " is forbidden but present"));
     }
   }
 
diff --git a/ndn-cxx/mgmt/nfd/control-parameters.hpp b/ndn-cxx/mgmt/nfd/control-parameters.hpp
index 682c590..18e5534 100644
--- a/ndn-cxx/mgmt/nfd/control-parameters.hpp
+++ b/ndn-cxx/mgmt/nfd/control-parameters.hpp
@@ -50,26 +50,26 @@
   CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL,
   CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD,
   CONTROL_PARAMETER_MTU,
-  CONTROL_PARAMETER_UBOUND
+  CONTROL_PARAMETER_UBOUND,
 };
 
-inline const std::string CONTROL_PARAMETER_FIELD[CONTROL_PARAMETER_UBOUND] = {
-  "Name",
-  "FaceId",
-  "Uri",
-  "LocalUri",
-  "Origin",
-  "Cost",
-  "Capacity",
-  "Count",
-  "Flags",
-  "Mask",
-  "Strategy",
-  "ExpirationPeriod",
-  "FacePersistency",
-  "BaseCongestionMarkingInterval",
-  "DefaultCongestionThreshold",
-  "Mtu"
+inline constexpr std::string_view CONTROL_PARAMETER_FIELD[CONTROL_PARAMETER_UBOUND] = {
+  "Name"sv,
+  "FaceId"sv,
+  "Uri"sv,
+  "LocalUri"sv,
+  "Origin"sv,
+  "Cost"sv,
+  "Capacity"sv,
+  "Count"sv,
+  "Flags"sv,
+  "Mask"sv,
+  "Strategy"sv,
+  "ExpirationPeriod"sv,
+  "FacePersistency"sv,
+  "BaseCongestionMarkingInterval"sv,
+  "DefaultCongestionThreshold"sv,
+  "Mtu"sv,
 };
 
 /**
diff --git a/ndn-cxx/name-component.cpp b/ndn-cxx/name-component.cpp
index ece7cc0..cc98046 100644
--- a/ndn-cxx/name-component.cpp
+++ b/ndn-cxx/name-component.cpp
@@ -114,12 +114,7 @@
   ensureValid();
 }
 
-Component::Component(const char* str)
-  : Block(makeBinaryBlock(tlv::GenericNameComponent, str, std::char_traits<char>::length(str)))
-{
-}
-
-Component::Component(const std::string& str)
+Component::Component(std::string_view str)
   : Block(makeStringBlock(tlv::GenericNameComponent, str))
 {
 }
@@ -134,10 +129,10 @@
 }
 
 static Component
-parseUriEscapedValue(uint32_t type, const char* input, size_t len)
+parseUriEscapedValue(uint32_t type, std::string_view input)
 {
   std::ostringstream oss;
-  unescape(oss, input, len);
+  unescape(oss, input);
   std::string value = oss.str();
   if (value.find_first_not_of('.') == std::string::npos) { // all periods
     if (value.size() < 3) {
@@ -149,25 +144,23 @@
 }
 
 Component
-Component::fromEscapedString(const std::string& input)
+Component::fromEscapedString(std::string_view input)
 {
   size_t equalPos = input.find('=');
-  if (equalPos == std::string::npos) {
-    return parseUriEscapedValue(tlv::GenericNameComponent, input.data(), input.size());
+  if (equalPos == std::string_view::npos) {
+    return parseUriEscapedValue(tlv::GenericNameComponent, input);
   }
 
   auto typePrefix = input.substr(0, equalPos);
   auto type = std::strtoul(typePrefix.data(), nullptr, 10);
   if (type >= tlv::NameComponentMin && type <= tlv::NameComponentMax &&
       std::to_string(type) == typePrefix) {
-    size_t valuePos = equalPos + 1;
-    return parseUriEscapedValue(static_cast<uint32_t>(type),
-                                input.data() + valuePos, input.size() - valuePos);
+    return parseUriEscapedValue(static_cast<uint32_t>(type), input.substr(equalPos + 1));
   }
 
   auto ct = getComponentTypeTable().findByUriPrefix(typePrefix);
   if (ct == nullptr) {
-    NDN_THROW(Error("Unknown TLV-TYPE '" + typePrefix + "' in NameComponent URI"));
+    NDN_THROW(Error("Unknown TLV-TYPE '" + std::string(typePrefix) + "' in NameComponent URI"));
   }
   return ct->parseAltUriValue(input.substr(equalPos + 1));
 }
diff --git a/ndn-cxx/name-component.hpp b/ndn-cxx/name-component.hpp
index 2c2deeb..839b46e 100644
--- a/ndn-cxx/name-component.hpp
+++ b/ndn-cxx/name-component.hpp
@@ -194,20 +194,12 @@
   }
 
   /**
-   * @brief Construct a GenericNameComponent, copying the TLV-VALUE from a null-terminated string.
-   *
-   * Bytes from the string are copied as is, and not interpreted as URI component.
-   */
-  explicit
-  Component(const char* str);
-
-  /**
    * @brief Construct a GenericNameComponent, copying the TLV-VALUE from a string.
    *
    * Bytes from the string are copied as is, and not interpreted as URI component.
    */
   explicit
-  Component(const std::string& str);
+  Component(std::string_view str);
 
 public: // encoding and URI
   /**
@@ -235,11 +227,13 @@
    * The URI component is read from `[input+beginOffset, input+endOffset)` range.
    *
    * @throw Error URI component does not represent a valid NameComponent.
+   * @deprecated Use fromEscapedString(std::string_view)
    */
+  [[deprecated("use the string_view overload")]]
   static Component
   fromEscapedString(const char* input, size_t beginOffset, size_t endOffset)
   {
-    return fromEscapedString(std::string(input + beginOffset, input + endOffset));
+    return fromEscapedString(std::string_view(input + beginOffset, endOffset - beginOffset));
   }
 
   /**
@@ -247,17 +241,7 @@
    * @throw Error URI component does not represent a valid NameComponent.
    */
   static Component
-  fromEscapedString(const char* input)
-  {
-    return fromEscapedString(std::string(input));
-  }
-
-  /**
-   * @brief Decode NameComponent from a URI component.
-   * @throw Error URI component does not represent a valid NameComponent.
-   */
-  static Component
-  fromEscapedString(const std::string& input);
+  fromEscapedString(std::string_view input);
 
   /**
    * @brief Write `*this` to the output stream, escaping characters according to the NDN URI format.
diff --git a/ndn-cxx/name.cpp b/ndn-cxx/name.cpp
index 42f3f26..1c158ce 100644
--- a/ndn-cxx/name.cpp
+++ b/ndn-cxx/name.cpp
@@ -60,52 +60,47 @@
   m_wire.parse();
 }
 
-Name::Name(const char* uri)
-  : Name(std::string(uri))
-{
-}
-
-Name::Name(std::string uri)
+Name::Name(std::string_view uri)
 {
   if (uri.empty())
     return;
 
-  if (size_t iColon = uri.find(':'); iColon != std::string::npos) {
-    // Make sure the colon came before a '/'.
+  if (size_t iColon = uri.find(':'); iColon != std::string_view::npos) {
+    // Make sure the colon came before a '/', if any.
     size_t iFirstSlash = uri.find('/');
-    if (iFirstSlash == std::string::npos || iColon < iFirstSlash) {
-      // Omit the leading protocol such as ndn:
-      uri.erase(0, iColon + 1);
+    if (iFirstSlash == std::string_view::npos || iColon < iFirstSlash) {
+      // Strip the leading protocol such as "ndn:".
+      uri.remove_prefix(iColon + 1);
     }
   }
 
   // Trim the leading slash and possibly the authority.
-  if (uri[0] == '/') {
+  if (uri.size() >= 1 && uri[0] == '/') {
     if (uri.size() >= 2 && uri[1] == '/') {
       // Strip the authority following "//".
       size_t iAfterAuthority = uri.find('/', 2);
-      if (iAfterAuthority == std::string::npos)
+      if (iAfterAuthority == std::string_view::npos) {
         // Unusual case: there was only an authority.
         return;
+      }
       else {
-        uri.erase(0, iAfterAuthority + 1);
+        uri.remove_prefix(iAfterAuthority + 1);
       }
     }
     else {
-      uri.erase(0, 1);
+      uri.remove_prefix(1);
     }
   }
 
-  size_t iComponentStart = 0;
-
   // Unescape the components.
-  while (iComponentStart < uri.size()) {
-    size_t iComponentEnd = uri.find('/', iComponentStart);
-    if (iComponentEnd == std::string::npos)
-      iComponentEnd = uri.size();
-
-    append(Component::fromEscapedString(&uri[0], iComponentStart, iComponentEnd));
-    iComponentStart = iComponentEnd + 1;
+  while (!uri.empty()) {
+    auto component = uri.substr(0, uri.find('/'));
+    append(Component::fromEscapedString(component));
+    if (component.size() + 1 >= uri.size()) {
+      // We reached the end of the string.
+      return;
+    }
+    uri.remove_prefix(component.size() + 1);
   }
 }
 
diff --git a/ndn-cxx/name.hpp b/ndn-cxx/name.hpp
index 936cf5b..a45c3fc 100644
--- a/ndn-cxx/name.hpp
+++ b/ndn-cxx/name.hpp
@@ -64,34 +64,51 @@
   using size_type              = component_container::size_type;
 
 public: // constructors, encoding, decoding
-  /** @brief Create an empty name.
-   *  @post empty() == true
+  /**
+   * @brief Create an empty name.
+   * @post empty() == true
    */
   Name();
 
-  /** @brief Decode Name from wire encoding.
-   *  @throw tlv::Error wire encoding is invalid
+  /**
+   * @brief Decode Name from wire encoding.
+   * @throw tlv::Error wire encoding is invalid
    *
-   *  This is a more efficient equivalent for
-   *  @code
-   *    Name name;
-   *    name.wireDecode(wire);
-   *  @endcode
+   * This is a more efficient equivalent for:
+   * @code
+   * Name name;
+   * name.wireDecode(wire);
+   * @endcode
    */
   explicit
   Name(const Block& wire);
 
-  /** @brief Parse name from NDN URI.
-   *  @param uri a null-terminated URI string
-   *  @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
+  /**
+   * @brief Create name from NDN URI.
+   * @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
    */
-  Name(const char* uri);
+  explicit
+  Name(std::string_view uri);
 
-  /** @brief Create name from NDN URI.
-   *  @param uri a URI string
-   *  @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
+  /**
+   * @brief Create name from NDN URI.
+   * @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
+   * @note This constructor enables implicit conversion from a string literal
    */
-  Name(std::string uri);
+  Name(const char* uri)
+    : Name(std::string_view(uri))
+  {
+  }
+
+  /**
+   * @brief Create name from NDN URI.
+   * @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
+   * @note This constructor enables implicit conversion from `std::string`
+   */
+  Name(const std::string& uri)
+    : Name(std::string_view(uri))
+  {
+  }
 
   /** @brief Write URI representation of the name to the output stream.
    *  @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
@@ -510,10 +527,10 @@
    * @return A reference to this Name, to allow chaining.
    */
   Name&
-  appendKeyword(const char* keyword)
+  appendKeyword(std::string_view keyword)
   {
-    return append(Component(tlv::KeywordNameComponent, {reinterpret_cast<const uint8_t*>(keyword),
-                                                        std::char_traits<char>::length(keyword)}));
+    return append(Component(tlv::KeywordNameComponent,
+                            {reinterpret_cast<const uint8_t*>(keyword.data()), keyword.size()}));
   }
 
   /**
diff --git a/ndn-cxx/net/ethernet.hpp b/ndn-cxx/net/ethernet.hpp
index ed25834..62b233c 100644
--- a/ndn-cxx/net/ethernet.hpp
+++ b/ndn-cxx/net/ethernet.hpp
@@ -89,8 +89,7 @@
    *        in hexadecimal notation, with colons or hyphens as separators.
    *
    * \param str The string to be parsed
-   * \return Always an instance of Address, which will be null
-   *         if the parsing fails
+   * \return Always an instance of Address, which will be null if parsing fails
    */
   static Address
   fromString(const std::string& str);
diff --git a/ndn-cxx/net/face-uri.cpp b/ndn-cxx/net/face-uri.cpp
index 14db8d9..239c0d2 100644
--- a/ndn-cxx/net/face-uri.cpp
+++ b/ndn-cxx/net/face-uri.cpp
@@ -43,35 +43,30 @@
 
 BOOST_CONCEPT_ASSERT((boost::EqualityComparable<FaceUri>));
 
-FaceUri::FaceUri()
-  : m_isV6(false)
-{
-}
+FaceUri::FaceUri() = default;
 
 FaceUri::FaceUri(const std::string& uri)
 {
   if (!parse(uri)) {
-    NDN_THROW(Error("Malformed URI: " + uri));
+    NDN_THROW(Error("Malformed URI: "s + uri));
   }
 }
 
 FaceUri::FaceUri(const char* uri)
-  : FaceUri(std::string(uri))
 {
+  if (!parse(uri)) {
+    NDN_THROW(Error("Malformed URI: "s + uri));
+  }
 }
 
 bool
-FaceUri::parse(const std::string& uri)
+FaceUri::parse(std::string_view uri)
 {
-  m_scheme.clear();
-  m_host.clear();
-  m_port.clear();
-  m_path.clear();
-  m_isV6 = false;
+  *this = {};
 
   static const std::regex protocolExp("(\\w+\\d?(\\+\\w+)?)://([^/]*)(\\/[^?]*)?");
-  std::smatch protocolMatch;
-  if (!std::regex_match(uri, protocolMatch, protocolExp)) {
+  std::match_results<std::string_view::const_iterator> protocolMatch;
+  if (!std::regex_match(uri.begin(), uri.end(), protocolMatch, protocolExp)) {
     return false;
   }
   m_scheme = protocolMatch[1];
@@ -133,7 +128,7 @@
   m_port = to_string(endpoint.port());
 }
 
-FaceUri::FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::string& scheme)
+FaceUri::FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, std::string_view scheme)
 {
   m_isV6 = endpoint.address().is_v6();
   m_scheme = scheme;
@@ -145,11 +140,17 @@
 FaceUri::FaceUri(const boost::asio::local::stream_protocol::endpoint& endpoint)
   : m_scheme("unix")
   , m_path(endpoint.path())
-  , m_isV6(false)
 {
 }
 #endif // BOOST_ASIO_HAS_LOCAL_SOCKETS
 
+FaceUri::FaceUri(const ethernet::Address& address)
+  : m_scheme("ether")
+  , m_host(address.toString())
+  , m_isV6(true)
+{
+}
+
 FaceUri
 FaceUri::fromFd(int fd)
 {
@@ -159,15 +160,8 @@
   return uri;
 }
 
-FaceUri::FaceUri(const ethernet::Address& address)
-  : m_scheme("ether")
-  , m_host(address.toString())
-  , m_isV6(true)
-{
-}
-
 FaceUri
-FaceUri::fromDev(const std::string& ifname)
+FaceUri::fromDev(std::string_view ifname)
 {
   FaceUri uri;
   uri.m_scheme = "dev";
@@ -176,7 +170,7 @@
 }
 
 FaceUri
-FaceUri::fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, const std::string& ifname)
+FaceUri::fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, std::string_view ifname)
 {
   FaceUri uri;
   uri.m_scheme = endpoint.address().is_v6() ? "udp6+dev" : "udp4+dev";
diff --git a/ndn-cxx/net/face-uri.hpp b/ndn-cxx/net/face-uri.hpp
index 412a4ea..d427858 100644
--- a/ndn-cxx/net/face-uri.hpp
+++ b/ndn-cxx/net/face-uri.hpp
@@ -51,24 +51,30 @@
     using std::invalid_argument::invalid_argument;
   };
 
+  /// Construct an empty FaceUri.
   FaceUri();
 
   /**
-   * \brief Construct by parsing.
-   * \param uri scheme://host[:port]/path
-   * \throw FaceUri::Error if URI cannot be parsed
+   * \brief Construct by parsing from a string.
+   * \param uri `scheme://host[:port]/path`
+   * \throw Error URI cannot be parsed
    */
   explicit
   FaceUri(const std::string& uri);
 
-  // This overload is needed so that calls with string literal won't be
-  // resolved to boost::asio::local::stream_protocol::endpoint overload.
+  /**
+   * \brief Construct by parsing from a null-terminated string.
+   * \param uri `scheme://host[:port]/path`
+   * \throw Error URI cannot be parsed
+   * \note This overload is needed so that calls with a string literal won't be
+   *       resolved to the boost::asio::local::stream_protocol::endpoint overload.
+   */
   explicit
   FaceUri(const char* uri);
 
   /// Exception-safe parsing.
   [[nodiscard]] bool
-  parse(const std::string& uri);
+  parse(std::string_view uri);
 
 public: // scheme-specific construction
   /// Construct a udp4 or udp6 canonical FaceUri.
@@ -80,7 +86,7 @@
   FaceUri(const boost::asio::ip::tcp::endpoint& endpoint);
 
   /// Construct a tcp canonical FaceUri with custom scheme.
-  FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::string& scheme);
+  FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, std::string_view scheme);
 
 #ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS
   /// Construct a unix canonical FaceUri.
@@ -88,21 +94,21 @@
   FaceUri(const boost::asio::local::stream_protocol::endpoint& endpoint);
 #endif // BOOST_ASIO_HAS_LOCAL_SOCKETS
 
-  /// Construct an fd FaceUri from a file descriptor.
-  static FaceUri
-  fromFd(int fd);
-
   /// Construct an ether canonical FaceUri.
   explicit
   FaceUri(const ethernet::Address& address);
 
+  /// Construct an fd FaceUri from a file descriptor.
+  static FaceUri
+  fromFd(int fd);
+
   /// Construct a dev FaceUri from a network device name.
   static FaceUri
-  fromDev(const std::string& ifname);
+  fromDev(std::string_view ifname);
 
   /// Construct a udp4 or udp6 NIC-associated FaceUri from endpoint and network device name.
   static FaceUri
-  fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, const std::string& ifname);
+  fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, std::string_view ifname);
 
 public: // getters
   /// Get scheme (protocol)
@@ -112,7 +118,7 @@
     return m_scheme;
   }
 
-  /// Get host (domain)
+  /// Get host (domain or address)
   const std::string&
   getHost() const
   {
@@ -133,7 +139,7 @@
     return m_path;
   }
 
-  /// Serialize as a string
+  /// Return string representation
   std::string
   toString() const;
 
@@ -156,8 +162,9 @@
   using CanonizeFailureCallback = std::function<void(const std::string& reason)>;
 
   /** \brief Asynchronously convert this FaceUri to canonical form.
-   *  \param onSuccess function to call after this FaceUri is converted to canonical form
    *  \note A new FaceUri in canonical form will be created; this FaceUri is unchanged.
+   *
+   *  \param onSuccess function to call after this FaceUri is converted to canonical form
    *  \param onFailure function to call if this FaceUri cannot be converted to canonical form
    *  \param io        reference to `boost::asio::io_service` instance
    *  \param timeout   maximum allowable duration of the operations.
@@ -195,8 +202,7 @@
   std::string m_host;
   std::string m_port;
   std::string m_path;
-  /// whether to add [] around host when writing string
-  bool m_isV6;
+  bool m_isV6 = false; ///< whether to add [] around host when converting to string representation
 
   friend std::ostream& operator<<(std::ostream& os, const FaceUri& uri);
 };
diff --git a/ndn-cxx/security/pib/identity.hpp b/ndn-cxx/security/pib/identity.hpp
index 0bf3821..31acd9b 100644
--- a/ndn-cxx/security/pib/identity.hpp
+++ b/ndn-cxx/security/pib/identity.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -176,7 +176,10 @@
   friend std::ostream&
   operator<<(std::ostream& os, const Identity& id)
   {
-    return os << (id ? id.getName() : "(empty)");
+    if (id)
+      return os << id.getName();
+    else
+      return os << "(empty)";
   }
 
 private:
diff --git a/ndn-cxx/security/pib/key.hpp b/ndn-cxx/security/pib/key.hpp
index 3172342..124ddc5 100644
--- a/ndn-cxx/security/pib/key.hpp
+++ b/ndn-cxx/security/pib/key.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -195,7 +195,10 @@
   friend std::ostream&
   operator<<(std::ostream& os, const Key& key)
   {
-    return os << (key ? key.getName() : "(empty)");
+    if (key)
+      return os << key.getName();
+    else
+      return os << "(empty)";
   }
 
 private:
diff --git a/ndn-cxx/security/signing-info.cpp b/ndn-cxx/security/signing-info.cpp
index aa73fea..1fd152f 100644
--- a/ndn-cxx/security/signing-info.cpp
+++ b/ndn-cxx/security/signing-info.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2021 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -24,7 +24,6 @@
 #include "ndn-cxx/encoding/buffer-stream.hpp"
 #include "ndn-cxx/security/transform/base64-decode.hpp"
 #include "ndn-cxx/security/transform/buffer-source.hpp"
-#include "ndn-cxx/security/transform/digest-filter.hpp"
 #include "ndn-cxx/security/transform/stream-sink.hpp"
 
 namespace ndn {
@@ -68,34 +67,34 @@
   this->setPibKey(key);
 }
 
-SigningInfo::SigningInfo(const std::string& signingStr)
+SigningInfo::SigningInfo(std::string_view signingStr)
   : SigningInfo(SIGNER_TYPE_NULL)
 {
   if (signingStr.empty()) {
     return;
   }
 
-  size_t pos = signingStr.find(':');
-  if (pos == std::string::npos) {
+  auto pos = signingStr.find(':');
+  if (pos == std::string_view::npos) {
     NDN_THROW(std::invalid_argument("Invalid signing string cannot represent SigningInfo"));
   }
 
-  std::string scheme = signingStr.substr(0, pos);
-  std::string nameArg = signingStr.substr(pos + 1);
+  auto scheme = signingStr.substr(0, pos);
+  auto nameArg = signingStr.substr(pos + 1);
 
   if (scheme == "id") {
     if (nameArg == getDigestSha256Identity().toUri()) {
       setSha256Signing();
     }
     else {
-      setSigningIdentity(nameArg);
+      setSigningIdentity(Name(nameArg));
     }
   }
   else if (scheme == "key") {
-    setSigningKeyName(nameArg);
+    setSigningKeyName(Name(nameArg));
   }
   else if (scheme == "cert") {
-    setSigningCertName(nameArg);
+    setSigningCertName(Name(nameArg));
   }
   else if (scheme == "hmac-sha256") {
     setSigningHmacKey(nameArg);
@@ -133,7 +132,7 @@
 }
 
 SigningInfo&
-SigningInfo::setSigningHmacKey(const std::string& hmacKey)
+SigningInfo::setSigningHmacKey(std::string_view hmacKey)
 {
   m_type = SIGNER_TYPE_HMAC;
 
diff --git a/ndn-cxx/security/signing-info.hpp b/ndn-cxx/security/signing-info.hpp
index 7a87a3f..1cf56fa 100644
--- a/ndn-cxx/security/signing-info.hpp
+++ b/ndn-cxx/security/signing-info.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -114,7 +114,7 @@
    * - sign with SHA-256 (digest only): `id:/localhost/identity/digest-sha256`
    */
   explicit
-  SigningInfo(const std::string& signingStr);
+  SigningInfo(std::string_view signingStr);
 
   /**
    * @brief Set signer as an identity with name @p identity
@@ -142,7 +142,7 @@
    * @post Change the signerType to SIGNER_TYPE_HMAC
    */
   SigningInfo&
-  setSigningHmacKey(const std::string& hmacKey);
+  setSigningHmacKey(std::string_view hmacKey);
 
   /**
    * @brief Set SHA-256 as the signing method
diff --git a/ndn-cxx/security/transform/buffer-source.cpp b/ndn-cxx/security/transform/buffer-source.cpp
index e050f7f..8333368 100644
--- a/ndn-cxx/security/transform/buffer-source.cpp
+++ b/ndn-cxx/security/transform/buffer-source.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,7 +30,7 @@
 {
 }
 
-BufferSource::BufferSource(const std::string& string)
+BufferSource::BufferSource(std::string_view string)
   : m_bufs({{reinterpret_cast<const uint8_t*>(string.data()), string.size()}})
 {
 }
diff --git a/ndn-cxx/security/transform/buffer-source.hpp b/ndn-cxx/security/transform/buffer-source.hpp
index 9a9cd64..7d87320 100644
--- a/ndn-cxx/security/transform/buffer-source.hpp
+++ b/ndn-cxx/security/transform/buffer-source.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -23,7 +23,6 @@
 #define NDN_CXX_SECURITY_TRANSFORM_BUFFER_SOURCE_HPP
 
 #include "ndn-cxx/security/transform/transform-base.hpp"
-#include "ndn-cxx/encoding/buffer.hpp"
 #include "ndn-cxx/security/security-common.hpp"
 
 namespace ndn {
@@ -50,7 +49,7 @@
    * Caller must not destroy the string before the transformation is completed.
    */
   explicit
-  BufferSource(const std::string& string);
+  BufferSource(std::string_view string);
 
   /**
    * @brief Take @p buffers as input.
diff --git a/ndn-cxx/security/validator-config/checker.cpp b/ndn-cxx/security/validator-config/checker.cpp
index 675a54b..c11b477 100644
--- a/ndn-cxx/security/validator-config/checker.cpp
+++ b/ndn-cxx/security/validator-config/checker.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2021 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,8 +22,6 @@
 #include "ndn-cxx/security/validator-config/checker.hpp"
 #include "ndn-cxx/security/validation-policy.hpp"
 #include "ndn-cxx/security/validation-state.hpp"
-#include "ndn-cxx/security/verification-helpers.hpp"
-#include "ndn-cxx/security/pib/key.hpp"
 
 #include <boost/algorithm/string/predicate.hpp>
 
@@ -147,8 +145,8 @@
 }
 
 HyperRelationChecker::HyperRelationChecker(tlv::SignatureTypeValue sigType,
-                                           const std::string& pktNameExpr, const std::string pktNameExpand,
-                                           const std::string& klNameExpr, const std::string klNameExpand,
+                                           const std::string& pktNameExpr, const std::string& pktNameExpand,
+                                           const std::string& klNameExpr, const std::string& klNameExpand,
                                            const NameRelation& hyperRelation)
   : Checker(sigType)
   , m_hyperPRegex(pktNameExpr, pktNameExpand)
diff --git a/ndn-cxx/security/validator-config/checker.hpp b/ndn-cxx/security/validator-config/checker.hpp
index fa5c021..1156011 100644
--- a/ndn-cxx/security/validator-config/checker.hpp
+++ b/ndn-cxx/security/validator-config/checker.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -170,8 +170,8 @@
 {
 public:
   HyperRelationChecker(tlv::SignatureTypeValue sigType,
-                       const std::string& pktNameExpr, const std::string pktNameExpand,
-                       const std::string& klNameExpr, const std::string klNameExpand,
+                       const std::string& pktNameExpr, const std::string& pktNameExpand,
+                       const std::string& klNameExpr, const std::string& klNameExpand,
                        const NameRelation& hyperRelation);
 
 protected:
diff --git a/ndn-cxx/transport/tcp-transport.cpp b/ndn-cxx/transport/tcp-transport.cpp
index 0c5e516..20360ef 100644
--- a/ndn-cxx/transport/tcp-transport.cpp
+++ b/ndn-cxx/transport/tcp-transport.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -21,6 +21,7 @@
 
 #include "ndn-cxx/transport/tcp-transport.hpp"
 #include "ndn-cxx/transport/detail/stream-transport-with-resolver-impl.hpp"
+
 #include "ndn-cxx/net/face-uri.hpp"
 #include "ndn-cxx/util/logger.hpp"
 
@@ -29,7 +30,7 @@
 
 namespace ndn {
 
-TcpTransport::TcpTransport(const std::string& host, const std::string& port/* = "6363"*/)
+TcpTransport::TcpTransport(const std::string& host, const std::string& port)
   : m_host(host)
   , m_port(port)
 {
@@ -40,8 +41,8 @@
 shared_ptr<TcpTransport>
 TcpTransport::create(const std::string& uri)
 {
-  const auto hostAndPort(getSocketHostAndPortFromUri(uri));
-  return make_shared<TcpTransport>(hostAndPort.first, hostAndPort.second);
+  auto [host, port] = getSocketHostAndPortFromUri(uri);
+  return make_shared<TcpTransport>(host, port);
 }
 
 std::pair<std::string, std::string>
@@ -57,7 +58,7 @@
   try {
     const FaceUri uri(uriString);
 
-    const std::string scheme = uri.getScheme();
+    const auto& scheme = uri.getScheme();
     if (scheme != "tcp" && scheme != "tcp4" && scheme != "tcp6") {
       NDN_THROW(Error("Cannot create TcpTransport from \"" + scheme + "\" URI"));
     }
@@ -65,7 +66,6 @@
     if (!uri.getHost().empty()) {
       host = uri.getHost();
     }
-
     if (!uri.getPort().empty()) {
       port = uri.getPort();
     }
diff --git a/ndn-cxx/transport/unix-transport.cpp b/ndn-cxx/transport/unix-transport.cpp
index b8404eb..110423a 100644
--- a/ndn-cxx/transport/unix-transport.cpp
+++ b/ndn-cxx/transport/unix-transport.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,7 +22,6 @@
 #include "ndn-cxx/transport/unix-transport.hpp"
 #include "ndn-cxx/transport/detail/stream-transport-impl.hpp"
 
-#include "ndn-cxx/face.hpp"
 #include "ndn-cxx/net/face-uri.hpp"
 #include "ndn-cxx/util/logger.hpp"
 
diff --git a/ndn-cxx/util/indented-stream.cpp b/ndn-cxx/util/indented-stream.cpp
index ba78f33..e178c13 100644
--- a/ndn-cxx/util/indented-stream.cpp
+++ b/ndn-cxx/util/indented-stream.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2018 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -30,7 +30,7 @@
 namespace ndn {
 namespace util {
 
-IndentedStream::IndentedStream(std::ostream& os, const std::string& indent)
+IndentedStream::IndentedStream(std::ostream& os, std::string_view indent)
   : std::ostream(&m_buffer)
   , m_buffer(os, indent)
 {
@@ -41,7 +41,7 @@
   flush();
 }
 
-IndentedStream::StreamBuf::StreamBuf(std::ostream& os, const std::string& indent)
+IndentedStream::StreamBuf::StreamBuf(std::ostream& os, std::string_view indent)
   : m_output(os)
   , m_indent(indent)
 {
@@ -50,9 +50,9 @@
 int
 IndentedStream::StreamBuf::sync()
 {
-  typedef boost::iterator_range<std::string::const_iterator> StringView;
+  using StringView = boost::iterator_range<std::string::const_iterator>;
 
-  const std::string& output = str();
+  std::string output = str();
   std::vector<StringView> splitOutput;
   boost::split(splitOutput, output, boost::is_any_of("\n"));
 
diff --git a/ndn-cxx/util/indented-stream.hpp b/ndn-cxx/util/indented-stream.hpp
index 7b05960..b2d5059 100644
--- a/ndn-cxx/util/indented-stream.hpp
+++ b/ndn-cxx/util/indented-stream.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2021 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -54,7 +54,7 @@
 class IndentedStream : public std::ostream
 {
 public:
-  IndentedStream(std::ostream& os, const std::string& indent);
+  IndentedStream(std::ostream& os, std::string_view indent);
 
   ~IndentedStream() override;
 
@@ -63,7 +63,7 @@
   class StreamBuf : public std::stringbuf
   {
   public:
-    StreamBuf(std::ostream& os, const std::string& indent);
+    StreamBuf(std::ostream& os, std::string_view indent);
 
     int
     sync() override;
diff --git a/ndn-cxx/util/logger.cpp b/ndn-cxx/util/logger.cpp
index 4ebdf15..c9bea26 100644
--- a/ndn-cxx/util/logger.cpp
+++ b/ndn-cxx/util/logger.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -22,8 +22,6 @@
 #include "ndn-cxx/util/logger.hpp"
 #include "ndn-cxx/util/logging.hpp"
 
-#include <cstring> // for std::strspn()
-
 namespace ndn {
 namespace util {
 
@@ -49,11 +47,11 @@
     return os << "ALL";
   }
 
-  NDN_THROW(std::invalid_argument("unknown log level " + to_string(to_underlying(level))));
+  NDN_THROW(std::invalid_argument("unknown log level " + std::to_string(to_underlying(level))));
 }
 
 LogLevel
-parseLogLevel(const std::string& s)
+parseLogLevel(std::string_view s)
 {
   if (s == "FATAL")
     return LogLevel::FATAL;
@@ -72,24 +70,19 @@
   else if (s == "ALL")
     return LogLevel::ALL;
 
-  NDN_THROW(std::invalid_argument("unrecognized log level '" + s + "'"));
+  NDN_THROW(std::invalid_argument("unrecognized log level '" + std::string(s) + "'"));
 }
 
-static bool
-isValidLoggerName(const std::string& name)
+static constexpr bool
+isValidLoggerName(std::string_view name)
 {
+  if (name.empty() || name.front() == '.' || name.back() == '.' ||
+      name.find("..") != std::string_view::npos) {
+    return false;
+  }
   // acceptable characters for Logger name
-  const char* okChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~#%_<>.-";
-  if (std::strspn(name.c_str(), okChars) != name.size()) {
-    return false;
-  }
-  if (name.empty() || name.front() == '.' || name.back() == '.') {
-    return false;
-  }
-  if (name.find("..") != std::string::npos) {
-    return false;
-  }
-  return true;
+  constexpr std::string_view okChars{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~#%_<>.-"sv};
+  return name.find_first_not_of(okChars) == std::string_view::npos;
 }
 
 Logger::Logger(const char* name)
@@ -99,18 +92,17 @@
     NDN_THROW(std::invalid_argument("Logger name '" + m_moduleName + "' is invalid"));
   }
   this->setLevel(LogLevel::NONE);
-  this->add_attribute(log::module.get_name(), boost::log::attributes::constant<std::string>(m_moduleName));
+  this->add_attribute(log::module.get_name(), boost::log::attributes::constant(m_moduleName));
   Logging::get().addLoggerImpl(*this);
 }
 
 void
 Logger::registerModuleName(const char* name)
 {
-  std::string moduleName(name);
-  if (!isValidLoggerName(moduleName)) {
-    NDN_THROW(std::invalid_argument("Logger name '" + moduleName + "' is invalid"));
+  if (!isValidLoggerName(name)) {
+    NDN_THROW(std::invalid_argument("Logger name '"s + name + "' is invalid"));
   }
-  Logging::get().registerLoggerNameImpl(std::move(moduleName));
+  Logging::get().registerLoggerNameImpl(name);
 }
 
 } // namespace util
diff --git a/ndn-cxx/util/logger.hpp b/ndn-cxx/util/logger.hpp
index bdf1c07..3261b85 100644
--- a/ndn-cxx/util/logger.hpp
+++ b/ndn-cxx/util/logger.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2021 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -37,7 +37,8 @@
 namespace ndn {
 namespace util {
 
-/** \brief Indicates the severity level of a log message.
+/**
+ * \brief Indicates the severity level of a log message.
  */
 enum class LogLevel {
   FATAL   = -1,   ///< fatal (will be logged unconditionally)
@@ -50,17 +51,19 @@
   ALL     = 255   ///< all messages
 };
 
-/** \brief Output LogLevel as a string.
- *  \throw std::invalid_argument unknown \p level
+/**
+ * \brief Output LogLevel as a string.
+ * \throw std::invalid_argument Unknown \p level
  */
 std::ostream&
 operator<<(std::ostream& os, LogLevel level);
 
-/** \brief Parse LogLevel from a string.
- *  \throw std::invalid_argument unknown level name
+/**
+ * \brief Parse LogLevel from a string.
+ * \throw std::invalid_argument Unknown level name
  */
 LogLevel
-parseLogLevel(const std::string& s);
+parseLogLevel(std::string_view s);
 
 namespace log {
 
@@ -69,10 +72,11 @@
 
 } // namespace log
 
-/** \brief Represents a log module in the logging facility.
+/**
+ * \brief Represents a log module in the logging facility.
  *
- *  \note Normally, loggers should be defined using #NDN_LOG_INIT, #NDN_LOG_MEMBER_INIT,
- *        or #NDN_LOG_MEMBER_INIT_SPECIALIZED.
+ * \note Normally, loggers should be defined using #NDN_LOG_INIT, #NDN_LOG_MEMBER_INIT,
+ *       or #NDN_LOG_MEMBER_INIT_SPECIALIZED.
  */
 class Logger : public boost::log::sources::severity_logger_mt<LogLevel>
 {
diff --git a/ndn-cxx/util/sha256.cpp b/ndn-cxx/util/sha256.cpp
index c789a7e..66355d6 100644
--- a/ndn-cxx/util/sha256.cpp
+++ b/ndn-cxx/util/sha256.cpp
@@ -92,7 +92,7 @@
 }
 
 Sha256&
-Sha256::operator<<(const std::string& str)
+Sha256::operator<<(std::string_view str)
 {
   update({reinterpret_cast<const uint8_t*>(str.data()), str.size()});
   return *this;
diff --git a/ndn-cxx/util/sha256.hpp b/ndn-cxx/util/sha256.hpp
index 76a094e..2e7b09c 100644
--- a/ndn-cxx/util/sha256.hpp
+++ b/ndn-cxx/util/sha256.hpp
@@ -122,7 +122,7 @@
    * @throw Error the digest has already been finalized
    */
   Sha256&
-  operator<<(const std::string& str);
+  operator<<(std::string_view str);
 
   /**
    * @brief Add a uint64_t value to the digest calculation.
diff --git a/ndn-cxx/util/string-helper.cpp b/ndn-cxx/util/string-helper.cpp
index 011f967..ef7f85b 100644
--- a/ndn-cxx/util/string-helper.cpp
+++ b/ndn-cxx/util/string-helper.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2021 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -57,7 +57,7 @@
 }
 
 shared_ptr<Buffer>
-fromHex(const std::string& hexString)
+fromHex(std::string_view hexString)
 {
   namespace tr = security::transform;
 
@@ -73,18 +73,17 @@
 }
 
 std::string
-escape(const std::string& str)
+escape(std::string_view str)
 {
   std::ostringstream os;
-  escape(os, str.data(), str.size());
+  escape(os, str);
   return os.str();
 }
 
 void
-escape(std::ostream& os, const char* str, size_t len)
+escape(std::ostream& os, std::string_view str)
 {
-  for (size_t i = 0; i < len; ++i) {
-    auto c = str[i];
+  for (auto c : str) {
     // Unreserved characters don't need to be escaped.
     if ((c >= 'a' && c <= 'z') ||
         (c >= 'A' && c <= 'Z') ||
@@ -102,18 +101,18 @@
 }
 
 std::string
-unescape(const std::string& str)
+unescape(std::string_view str)
 {
   std::ostringstream os;
-  unescape(os, str.data(), str.size());
+  unescape(os, str);
   return os.str();
 }
 
 void
-unescape(std::ostream& os, const char* str, size_t len)
+unescape(std::ostream& os, std::string_view str)
 {
-  for (size_t i = 0; i < len; ++i) {
-    if (str[i] == '%' && i + 2 < len) {
+  for (size_t i = 0; i < str.size(); ++i) {
+    if (str[i] == '%' && i + 2 < str.size()) {
       int hi = fromHexChar(str[i + 1]);
       int lo = fromHexChar(str[i + 2]);
 
diff --git a/ndn-cxx/util/string-helper.hpp b/ndn-cxx/util/string-helper.hpp
index 4447df4..9aa58c9 100644
--- a/ndn-cxx/util/string-helper.hpp
+++ b/ndn-cxx/util/string-helper.hpp
@@ -109,7 +109,7 @@
  * @throw StringHelperError Input string is invalid
  */
 shared_ptr<Buffer>
-fromHex(const std::string& hexString);
+fromHex(std::string_view hexString);
 
 /**
  * @brief Convert (the least significant nibble of) @p n to the corresponding hex character.
@@ -152,10 +152,17 @@
  * @see RFC 3986 section 2
  */
 [[nodiscard]] std::string
-escape(const std::string& str);
+escape(std::string_view str);
 
 void
-escape(std::ostream& os, const char* str, size_t len);
+escape(std::ostream& os, std::string_view str);
+
+[[deprecated("use the string_view overload")]]
+inline void
+escape(std::ostream& os, const char* str, size_t len)
+{
+  escape(os, {str, len});
+}
 
 /**
  * @brief Decode a percent-encoded string.
@@ -172,10 +179,17 @@
  * @see RFC 3986 section 2
  */
 [[nodiscard]] std::string
-unescape(const std::string& str);
+unescape(std::string_view str);
 
 void
-unescape(std::ostream& os, const char* str, size_t len);
+unescape(std::ostream& os, std::string_view str);
+
+[[deprecated("use the string_view overload")]]
+inline void
+unescape(std::ostream& os, const char* str, size_t len)
+{
+  unescape(os, {str, len});
+}
 
 } // namespace ndn
 
diff --git a/tests/test-home-fixture.hpp b/tests/test-home-fixture.hpp
index 3e3673f..5778a6e 100644
--- a/tests/test-home-fixture.hpp
+++ b/tests/test-home-fixture.hpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -46,7 +46,6 @@
 {
 public:
   PibDirFixture()
-    : m_pibDir(Path().PATH)
   {
     if (std::getenv("NDN_CLIENT_PIB") != nullptr) {
       m_oldPib = std::getenv("NDN_CLIENT_PIB");
@@ -81,7 +80,7 @@
   }
 
 protected:
-  const std::string m_pibDir;
+  const std::string m_pibDir{Path::PATH};
 
 private:
   std::string m_oldPib;
@@ -119,7 +118,7 @@
 
 struct DefaultPibDir
 {
-  const std::string PATH = "build/keys";
+  static constexpr std::string_view PATH{"build/keys"};
 };
 
 } // namespace tests
diff --git a/tests/unit/encoding/block-helpers.t.cpp b/tests/unit/encoding/block-helpers.t.cpp
index 9325851..ed8641e 100644
--- a/tests/unit/encoding/block-helpers.t.cpp
+++ b/tests/unit/encoding/block-helpers.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -31,6 +31,13 @@
 BOOST_AUTO_TEST_SUITE(Encoding)
 BOOST_AUTO_TEST_SUITE(TestBlockHelpers)
 
+BOOST_AUTO_TEST_CASE(Empty)
+{
+  Block b = makeEmptyBlock(200);
+  BOOST_CHECK_EQUAL(b.type(), 200);
+  BOOST_CHECK_EQUAL(b.value_size(), 0);
+}
+
 enum E8 : uint8_t
 {
   E8_NONE
@@ -69,21 +76,6 @@
   BOOST_CHECK_EQUAL(static_cast<uint16_t>(readNonNegativeIntegerAs<EC16>(b)), 1000);
 }
 
-BOOST_AUTO_TEST_CASE(Empty)
-{
-  Block b = makeEmptyBlock(200);
-  BOOST_CHECK_EQUAL(b.type(), 200);
-  BOOST_CHECK_EQUAL(b.value_size(), 0);
-}
-
-BOOST_AUTO_TEST_CASE(String)
-{
-  Block b = makeStringBlock(100, "Hello, world!");
-  BOOST_CHECK_EQUAL(b.type(), 100);
-  BOOST_CHECK_GT(b.value_size(), 0);
-  BOOST_CHECK_EQUAL(readString(b), "Hello, world!");
-}
-
 BOOST_AUTO_TEST_CASE(Double)
 {
   const double f = 0.25;
@@ -103,29 +95,41 @@
 
 BOOST_AUTO_TEST_CASE(Binary)
 {
-  std::string buf1{1, 1, 1, 1};
+  const std::string buf1{1, 1, 1, 1};
   const uint8_t buf2[]{1, 1, 1, 1};
-  std::list<uint8_t> buf3{1, 1, 1, 1};
+  const std::list<uint8_t> buf3{1, 1, 1, 1};
 
-  Block b1 = makeBinaryBlock(100, buf1.data(), buf1.size()); // char* overload
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+  Block b1 = makeBinaryBlock(100, buf1.data(), buf1.size()); // char* overload (deprecated)
+#pragma GCC diagnostic pop
   Block b2 = makeBinaryBlock(100, buf2);                     // span overload
   Block b3 = makeBinaryBlock(100, buf1.begin(), buf1.end()); // fast encoding (random access iterator)
   Block b4 = makeBinaryBlock(100, buf3.begin(), buf3.end()); // slow encoding (general iterator)
 
-  BOOST_CHECK_EQUAL(b1, b2);
-  BOOST_CHECK_EQUAL(b1, b3);
-  BOOST_CHECK_EQUAL(b1, b4);
-  BOOST_CHECK_EQUAL(b1.type(), 100);
-  BOOST_CHECK_EQUAL(b1.value_size(), buf1.size());
-  BOOST_CHECK_EQUAL_COLLECTIONS(b1.value_begin(), b1.value_end(), buf2, buf2 + sizeof(buf2));
+  BOOST_TEST(b1 == b2);
+  BOOST_TEST(b1 == b3);
+  BOOST_TEST(b1 == b4);
+  BOOST_TEST(b1.type() == 100);
+  BOOST_TEST(b1.value_size() == sizeof(buf2));
+  BOOST_TEST(b1.value_bytes() == buf2, boost::test_tools::per_element());
 
   EncodingEstimator estimator;
   size_t length = prependBinaryBlock(estimator, 100, buf2);
-  BOOST_CHECK_EQUAL(length, 6);
+  BOOST_TEST(length == 6);
 
   EncodingBuffer encoder(length, 0);
-  BOOST_CHECK_EQUAL(prependBinaryBlock(encoder, 100, buf2), 6);
-  BOOST_CHECK_EQUAL(encoder.block(), b1);
+  BOOST_TEST(prependBinaryBlock(encoder, 100, buf2) == 6);
+  BOOST_TEST(encoder.block() == b1);
+}
+
+BOOST_AUTO_TEST_CASE(String)
+{
+  constexpr std::string_view sv{"Hello, world!"sv};
+  Block b = makeStringBlock(100, sv);
+  BOOST_TEST(b.type() == 100);
+  BOOST_TEST(b.value_size() == sv.size());
+  BOOST_TEST(readString(b) == sv);
 }
 
 BOOST_AUTO_TEST_CASE(PrependBlock)
diff --git a/tests/unit/face.t.cpp b/tests/unit/face.t.cpp
index 2372e24..94a2649 100644
--- a/tests/unit/face.t.cpp
+++ b/tests/unit/face.t.cpp
@@ -854,11 +854,6 @@
 
 using ndn::Transport;
 
-struct PibDirWithDefaultTpm
-{
-  const std::string PATH = "build/keys-with-default-tpm";
-};
-
 BOOST_FIXTURE_TEST_CASE(FaceTransport, IoKeyChainFixture)
 {
   BOOST_CHECK(Face().getTransport() != nullptr);
diff --git a/tests/unit/name.t.cpp b/tests/unit/name.t.cpp
index bfddb4f..cfe13e0 100644
--- a/tests/unit/name.t.cpp
+++ b/tests/unit/name.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -68,13 +68,19 @@
 
   // URI with correct scheme
   BOOST_CHECK_EQUAL(Name("ndn:/hello/world").toUri(), "/hello/world");
+  BOOST_CHECK_EQUAL(Name("ndn:/").toUri(), "/");
+  BOOST_CHECK_EQUAL(Name("ndn:").toUri(), "/");
 
   // URI with incorrect scheme: auto-corrected
   BOOST_CHECK_EQUAL(Name("ncc:/hello/world").toUri(), "/hello/world");
+  BOOST_CHECK_EQUAL(Name(":/").toUri(), "/");
+  BOOST_CHECK_EQUAL(Name(":").toUri(), "/");
 
   // URI with authority: authority ignored
   BOOST_CHECK_EQUAL(Name("//authority/hello/world").toUri(), "/hello/world");
   BOOST_CHECK_EQUAL(Name("ndn://authority/hello/world").toUri(), "/hello/world");
+  BOOST_CHECK_EQUAL(Name("//authority").toUri(), "/");
+  BOOST_CHECK_EQUAL(Name("ndn://").toUri(), "/");
 
   // URI containing unescaped characters: auto-corrected
   BOOST_CHECK_EQUAL(Name("/ hello\t/\tworld \r\n").toUri(), "/%20hello%09/%09world%20%0D%0A");
@@ -84,8 +90,12 @@
   // URI not starting with '/': accepted as PartialName
   BOOST_CHECK_EQUAL(Name("").toUri(), "/");
   BOOST_CHECK_EQUAL(Name(" ").toUri(), "/%20");
+  BOOST_CHECK_EQUAL(Name("ndn: ").toUri(), "/%20");
+  BOOST_CHECK_EQUAL(Name("ndn: /").toUri(), "/%20");
   BOOST_CHECK_EQUAL(Name("  /hello/world").toUri(), "/%20%20/hello/world");
   BOOST_CHECK_EQUAL(Name("hello/world").toUri(), "/hello/world");
+  BOOST_CHECK_EQUAL(Name("hello").toUri(), "/hello");
+  BOOST_CHECK_EQUAL(Name("ndn:hello").toUri(), "/hello");
 
   // URI ending with '/': auto-corrected
   BOOST_CHECK_EQUAL(Name("/hello/world/").toUri(), "/hello/world");
diff --git a/tests/unit/security/key-chain.t.cpp b/tests/unit/security/key-chain.t.cpp
index 9bd97af..be544a4 100644
--- a/tests/unit/security/key-chain.t.cpp
+++ b/tests/unit/security/key-chain.t.cpp
@@ -59,7 +59,7 @@
 
 struct PibPathConfigFileHome
 {
-  const std::string PATH = "build/config-file-home/";
+  static constexpr std::string_view PATH = "build/config-file-home/";
 };
 
 BOOST_FIXTURE_TEST_CASE(ConstructorNormalConfig, TestHomeAndPibFixture<PibPathConfigFileHome>)
@@ -74,7 +74,7 @@
 
 struct PibPathConfigFileEmptyHome
 {
-  const std::string PATH = "build/config-file-empty-home/";
+  static constexpr std::string_view PATH = "build/config-file-empty-home/";
 };
 
 BOOST_FIXTURE_TEST_CASE(ConstructorEmptyConfig, TestHomeAndPibFixture<PibPathConfigFileEmptyHome>)
@@ -122,7 +122,7 @@
 
 struct PibPathConfigFileEmpty2Home
 {
-  const std::string PATH = "build/config-file-empty2-home/";
+  static constexpr std::string_view PATH = "build/config-file-empty2-home/";
 };
 
 BOOST_FIXTURE_TEST_CASE(ConstructorEmptyConfig2, TestHomeAndPibFixture<PibPathConfigFileEmpty2Home>)
@@ -137,7 +137,7 @@
 
 struct PibPathConfigFileMalformedHome
 {
-  const std::string PATH = "build/config-file-malformed-home/";
+  static constexpr std::string_view PATH = "build/config-file-malformed-home/";
 };
 
 BOOST_FIXTURE_TEST_CASE(ConstructorBadConfig, TestHomeAndPibFixture<PibPathConfigFileMalformedHome>)
@@ -148,7 +148,7 @@
 
 struct PibPathConfigFileMalformed2Home
 {
-  const std::string PATH = "build/config-file-malformed2-home/";
+  static constexpr std::string_view PATH = "build/config-file-malformed2-home/";
 };
 
 BOOST_FIXTURE_TEST_CASE(ConstructorBadConfig2, TestHomeAndPibFixture<PibPathConfigFileMalformed2Home>)
@@ -159,7 +159,7 @@
 
 struct PibPathConfigFileNonCanonicalTpm
 {
-  const std::string PATH = "build/config-file-non-canonical-tpm/";
+  static constexpr std::string_view PATH = "build/config-file-non-canonical-tpm/";
 };
 
 BOOST_FIXTURE_TEST_CASE(ConstructorNonCanonicalTpm, TestHomeAndPibFixture<PibPathConfigFileNonCanonicalTpm>) // Bug 4297
diff --git a/tests/unit/util/logging.t.cpp b/tests/unit/util/logging.t.cpp
index 821e11e..02da03a 100644
--- a/tests/unit/util/logging.t.cpp
+++ b/tests/unit/util/logging.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -162,7 +162,7 @@
 NDN_LOG_MEMBER_INIT_SPECIALIZED((ClassTemplateWithLogger<int, double>), ndn.util.tests.Specialized1);
 NDN_LOG_MEMBER_INIT_SPECIALIZED((ClassTemplateWithLogger<int, std::string>), ndn.util.tests.Specialized2);
 
-const time::microseconds LOG_SYSTIME(1468108800311239LL);
+constexpr time::microseconds LOG_SYSTIME{1468108800311239LL};
 const std::string LOG_SYSTIME_STR("1468108800.311239");
 
 class LoggingFixture : public ndn::tests::ClockFixture
@@ -177,7 +177,7 @@
     Logging::setDestination(os, true);
   }
 
-  ~LoggingFixture()
+  ~LoggingFixture() override
   {
     Logging::get().setLevelImpl(m_oldEnabledLevel);
     Logging::setDestination(m_oldDestination);
diff --git a/tests/unit/util/string-helper.t.cpp b/tests/unit/util/string-helper.t.cpp
index e3229e5..3816fab 100644
--- a/tests/unit/util/string-helper.t.cpp
+++ b/tests/unit/util/string-helper.t.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2013-2022 Regents of the University of California.
+ * Copyright (c) 2013-2023 Regents of the University of California.
  *
  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
  *
@@ -182,8 +182,7 @@
   BOOST_CHECK_EQUAL(escape(":/?#[]@"), "%3A%2F%3F%23%5B%5D%40");
 
   output_test_stream os;
-  const char str[] = "\x01\x2a\x3b\xc4\xde\xfa\xb5\xcd\xef";
-  escape(os, str, std::strlen(str));
+  escape(os, "\x01\x2a\x3b\xc4\xde\xfa\xb5\xcd\xef");
   BOOST_CHECK(os.is_equal("%01%2A%3B%C4%DE%FA%B5%CD%EF"));
 }
 
@@ -196,8 +195,7 @@
   BOOST_CHECK_EQUAL(unescape("Bad %a"), "Bad %a");
 
   output_test_stream os;
-  const char str[] = "%01%2a%3B%c4%de%fA%B5%Cd%EF";
-  unescape(os, str, std::strlen(str));
+  unescape(os, "%01%2a%3B%c4%de%fA%B5%Cd%EF");
   BOOST_CHECK(os.is_equal("\x01\x2a\x3b\xc4\xde\xfa\xb5\xcd\xef"));
 }
 
