why doing the default to utf-8 twice? maybe throw `IllegalArgumentException` when a falsy value is given?