This is surprising because it's behavior is very weird if the input is UTF-8. If you call this method first you get ASCII decoding (and some replacement chars in the output), if you call utf8 first you get UTF-8 decoding.

I think you should either

*  drop this method and callers can use utf-8.
* have this method delegate to utf8(), and then do a char-for-char check that the returned characters are all ASCII chars.

Charset nerd question: are there UTF-8 strings that contain non-ASCII chars and whose code point length is not equal to their byte length? Ie. can we do a quick ASCII check by comparing the byte array's length to the string's length?