Explicitly use `io.open` with UTF-8 encoding everywhere to fix #2