You can use rlang::exprs(...) as a replacement for eval(subsitute(alist(...))); and I'm not sure why you need the logic inside the if statement (I'm probably missing something).
Either way here's a (marginally) updated version of your working function that produces the same result:
fun_tidy <- function(...) {
dots <- exprs(...)
purrr::map_chr(dots, as.character)
}
E.g.:
original <- fun(blah = blubb, thisalso = "works")
tidy <- fun_tidy(blah = blubb, thisalso = "works")
identical(original, tidy)
#> TRUE
And both should work if the named item is also passed in as a character:
fun("blah" = "blubb", thisalso = "works")
fun_tidy("blah" = "blubb", thisalso = "works")