I came across an odd issue. I'm getting <meta name="generator" content="Bolt"></head>d> in my markup. It was caused by the fact I was using one of those curved quotation marks in my title (http://www.fileformat.info/info/unicode/char/2019/index.htm) which is made up of three bytes. In Str.replaceLast , mb_strrpos() is counting it as 1, but substr_replace() counts it as 3, causing the replace to leave that leftover d>. There isn't a multibyte substr_replace though?
To remedy this, we should:
Add a multibyte string replace method to bolt/common
Use that in Str::replaceLast, Str::replaceFirst and perhaps others.