Other issues were the documentation, the confusion about encoded and decoded data
We are tracking these here: https://github.com/CPPAlliance/url/issues/438 https://github.com/CPPAlliance/url/issues/448 and, in case anyone wants to contribute, these are the new functions, and types we are considering: pct_encoded_view -> decode_view pct_decode_opts -> decode_opts validate_pct_encoding -> (remove) pct_decode_bytes_unchecked -> (remove) pct_decode_unchecked -> decode_unchecked (private) pct_decode becomes a single function to validate and decode -> template< class CharSet = grammar::all_chars_t > auto decode( string_view s, CharSet const& allowed = {}, decode_opts const& opt = {}) -> result< decode_view > The functions for encoding are only renamed: pct_encode_opts -> encode_opts pct_encode_bytes -> encoded_size template <class CharSet> std::size_t encoded_size( string_view s, CharSet const& allowed, encode_opts const& opt = {}) noexcept; pct_encode -> encode template <class CharSet> std::size_t encode( char* dest, char const* end, string_view s, CharSet const& allowed, encode_opts const& opt = {}); pct_encode_to_string -> encode_to_string template< class CharSet, class Allocator = std::allocator<char> > std::basic_string<char, std::char_traits<char>, Allocator> encode_to_string( string_view s, CharSet const& allowed, encode_opts const& opt = {}, Allocator const& a = {}); -- Alan Freitas https://github.com/alandefreitas