Make CanBackquote(invalid UTF-8) return false.
Also add two test which show that CanBackquote reports
true for strings containing a BOM.
Fixes #7572.
LGTM=r
R=golang-codereviews, bradfitz, r
CC=golang-codereviews
https://golang.org/cl/
111780045
 // unchanged as a single-line backquoted string without control
 // characters other than space and tab.
 func CanBackquote(s string) bool {
-       for i := 0; i < len(s); i++ {
-               c := s[i]
-               if (c < ' ' && c != '\t') || c == '`' || c == '\u007F' {
+       for len(s) > 0 {
+               r, wid := utf8.DecodeRuneInString(s)
+               s = s[wid:]
+               if wid > 1 {
+                       continue // All multibyte runes are correctly encoded and assumed printable.
+               }
+               if r == utf8.RuneError {
+                       return false
+               }
+               if (r < ' ' && r != '\t') || r == '`' || r == '\u007F' {
                        return false
                }
        }
 
        {`ABCDEFGHIJKLMNOPQRSTUVWXYZ`, true},
        {`abcdefghijklmnopqrstuvwxyz`, true},
        {`☺`, true},
+       {"\x80", false},
+       {"a\xe0\xa0z", false},
+       {"\ufeffabc", true},
+       {"a\ufeffz", true},
 }
 
 func TestCanBackquote(t *testing.T) {