function __fish_urlencode --description "URL-encode stdin" if not type -q string return 1 end set -l join '' set -l chars # Set locale to C and IFS to "" in order to split a line into bytes. while begin; set -lx LC_ALL C; set -lx IFS ''; read -az chars; end printf '%s' $join # chomp off a trailing newline if test "$chars[-1]" = \n set -e chars[-1] set join '%0A%00' else set join '%00' end for c in $chars if string match -q -r '[/._~A-Za-z0-9-]' $c printf '%s' $c else printf '%%%02X' "'$c" end end end end