diff --git a/lib.go b/lib.go index eb8ced6..baa62bf 100644 --- a/lib.go +++ b/lib.go @@ -475,34 +475,35 @@ func bstrUnmarshal(s string) (result string) { result += s[cursor:match[0]] subStr := s[match[0]:match[1]] if subStr == "_x005F_" { + cursor = match[1] if l > match[1]+6 && !escapeExp.MatchString(s[match[1]:match[1]+6]) { result += subStr - cursor = match[1] - continue - } - if l > match[1]+5 && s[match[1]:match[1]+5] == "x005F" { - result += "_" - cursor = match[1] - continue - } - if escapeExp.MatchString(subStr) { - result += "_" - cursor = match[1] continue } + result += "_" + continue } if bstrExp.MatchString(subStr) { - x, _ := strconv.Unquote(`"\u` + s[match[0]+2:match[1]-1] + `"`) + cursor = match[1] + v, err := strconv.Unquote(`"\u` + s[match[0]+2:match[1]-1] + `"`) + if err != nil { + if l > match[1]+6 && escapeExp.MatchString(s[match[1]:match[1]+6]) { + result += subStr[:6] + cursor = match[1] + 6 + continue + } + result += subStr + continue + } hasRune := false - for _, c := range string(x) { + for _, c := range v { if unicode.IsControl(c) { hasRune = true } } if !hasRune { - result += string(x) + result += v } - cursor = match[1] } } if cursor < l { diff --git a/lib_test.go b/lib_test.go index 58c6ed9..ad20946 100644 --- a/lib_test.go +++ b/lib_test.go @@ -237,19 +237,22 @@ func TestGenXMLNamespace(t *testing.T) { func TestBstrUnmarshal(t *testing.T) { bstrs := map[string]string{ - "*_x0000_": "*", "*": "*", + "*_x0000_": "*", "*_x0008_": "*", "_x0008_*": "*", "*_x0008_*": "**", "*_x4F60__x597D_": "*你好", + "*_xG000_": "*_xG000_", + "*_xG05F_x0001_*": "*_xG05F*", "*_x005F__x0008_*": "*_x005F_*", "*_x005F_x0001_*": "*_x0001_*", + "*_x005f_x005F__x0008_*": "*_x005F_*", + "*_x005F_x005F_xG05F_x0006_*": "*_x005F_xG05F*", "*_x005F_x005F_x005F_x0006_*": "*_x005F_x0006_*", "_x005F__x0008_******": "_x005F_******", "******_x005F__x0008_": "******_x005F_", "******_x005F__x0008_******": "******_x005F_******", - "*_x005F_x005F__x0008_*": "*_x005F_*", } for bstr, expected := range bstrs { assert.Equal(t, expected, bstrUnmarshal(bstr))