I guess maybe your default wordpress settings are not UTF-8?
Nope it’s set to UTF-8.
I tracked it down simply by searching on pieces of the warning string, which eventually got me to the online PHP manual at php.net. There all the examples included the quotes — I tried it and it worked. So I think we can be comfortable it is a PHP thing, not a WP one.
The fact that it doesn’t show the warnings on your setup may have to do with your PHP config. Often it is set to suppress warnings, because they are not strictly “errors” in PHP lingo and it is common to ignore them. While I do have my install configured to suppress *display* of warnings, I set it to write them to a log file.
Full disclosure: I kept the small tweaks I made to your code that are really personal taste, not functionality, but then stopped using the plugin as I’ve locked wp-login.php down to be accessible from a single IP address. Which really obviates the need for brute force prevention and login notification. I still like to take related plugins for a test drive and if I can be helpful, I’ll try <smile>.
Thank you for contributing your work to the community, and best wishes for a great season!