diff --git a/marshal.go b/marshal.go index 94fded7..9c5fc63 100644 --- a/marshal.go +++ b/marshal.go @@ -8,9 +8,15 @@ import ( "time" ) +func escape(s string) string { + s = strings.Replace(s, `\`, `\\`, -1) + s = strings.Replace(s, `'`, `\'`, -1) + return s +} + func unescape(s string) string { - s = strings.Replace(s, "\\\\", "\\", -1) - s = strings.Replace(s, "\\'", "'", -1) + s = strings.Replace(s, `\\`, `\`, -1) + s = strings.Replace(s, `\'`, `'`, -1) return s } @@ -155,7 +161,7 @@ func marshal(value interface{}) string { } switch v := value.(type) { case string: - return fmt.Sprintf("'%s'", strings.Replace(v, "'", "\\'", -1)) + return fmt.Sprintf("'%s'", escape(v)) case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64: diff --git a/marshal_test.go b/marshal_test.go index d02809a..d6cff5b 100644 --- a/marshal_test.go +++ b/marshal_test.go @@ -128,9 +128,12 @@ func TestMarshal(t *testing.T) { assert.Equal(t, "'10'", marshal("10")) assert.Equal(t, "'String1\\''", marshal("String1'")) assert.Equal(t, "'String\r'", marshal("String\r")) + assert.Equal(t, "'String\r'", marshal("String\r")) + assert.Equal(t, `'String\\'`, marshal(`String\`)) assert.Equal(t, "[10,20,30]", marshal(Array{10, 20, 30})) assert.Equal(t, "['k10','20','30val']", marshal(Array{"k10", "20", "30val"})) assert.Equal(t, "['k10','20','30val']", marshal([]string{"k10", "20", "30val"})) + assert.Equal(t, "['k10','20','30val\\\\']", marshal([]string{"k10", "20", "30val\\"})) assert.Equal(t, "[10,20,30]", marshal([]int{10, 20, 30})) assert.Equal(t, "''", marshal(t)) }