summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib.go31
-rw-r--r--lib_test.go7
2 files changed, 21 insertions, 17 deletions
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))