diff --git a/encode.go b/encode.go index 8354f2a..42a71c8 100644 --- a/encode.go +++ b/encode.go @@ -233,7 +233,7 @@ func writeValue(w io.Writer, value interface{}) error { } func needsQuotedValueRune(r rune) bool { - return r <= ' ' || r == '=' || r == '"' || r == utf8.RuneError + return r <= ' ' || r == '=' || r == '"' || r == 0x7f || r == utf8.RuneError } func writeStringValue(w io.Writer, value string, ok bool) error { diff --git a/encode_test.go b/encode_test.go index c3afdd2..29ef3c0 100644 --- a/encode_test.go +++ b/encode_test.go @@ -56,9 +56,12 @@ func TestEncodeKeyval(t *testing.T) { {key: "k", value: "\xbd", want: `k="\ufffd"`}, {key: "k", value: "\ufffd\x00", want: `k="\ufffd\u0000"`}, {key: "k", value: "\ufffd", want: `k="\ufffd"`}, + {key: "k", value: "\u007f", want: `k="\u007f"`}, + {key: "k\u007f", value: "v", want: `k=v`}, {key: "k", value: []byte("\ufffd\x00"), want: `k="\ufffd\u0000"`}, {key: "k", value: []byte("\ufffd"), want: `k="\ufffd"`}, {key: "k", value: []byte("\u007f"), want: `k="\u007f"`}, + {key: []byte("k\u007f"), value: "v", want: `k=v`}, } for _, d := range data { diff --git a/jsonstring.go b/jsonstring.go index 030ac85..4550cb3 100644 --- a/jsonstring.go +++ b/jsonstring.go @@ -40,7 +40,7 @@ func writeQuotedString(w io.Writer, s string) (int, error) { start := 0 for i := 0; i < len(s); { if b := s[i]; b < utf8.RuneSelf { - if 0x20 <= b && b != '\\' && b != '"' { + if 0x20 <= b && b != '\\' && b != '"' && b != 0x7f { i++ continue } @@ -91,14 +91,14 @@ func writeQuotedString(w io.Writer, s string) (int, error) { return n, err } -// NOTE: keep in sync with writeQuoteString above. +// NOTE: keep in sync with writeQuotedString above. func writeQuotedBytes(w io.Writer, s []byte) (int, error) { buf := getBuffer() buf.WriteByte('"') start := 0 for i := 0; i < len(s); { if b := s[i]; b < utf8.RuneSelf { - if 0x20 <= b && b != '\\' && b != '"' { + if 0x20 <= b && b != '\\' && b != '"' && b != 0x7f { i++ continue }