unescape unescapes a string
(json string)
| 2252 | |
| 2253 | // unescape unescapes a string |
| 2254 | func unescape(json string) string { |
| 2255 | var str = make([]byte, 0, len(json)) |
| 2256 | for i := 0; i < len(json); i++ { |
| 2257 | switch { |
| 2258 | default: |
| 2259 | str = append(str, json[i]) |
| 2260 | case json[i] < ' ': |
| 2261 | return string(str) |
| 2262 | case json[i] == '\\': |
| 2263 | i++ |
| 2264 | if i >= len(json) { |
| 2265 | return string(str) |
| 2266 | } |
| 2267 | switch json[i] { |
| 2268 | default: |
| 2269 | return string(str) |
| 2270 | case '\\': |
| 2271 | str = append(str, '\\') |
| 2272 | case '/': |
| 2273 | str = append(str, '/') |
| 2274 | case 'b': |
| 2275 | str = append(str, '\b') |
| 2276 | case 'f': |
| 2277 | str = append(str, '\f') |
| 2278 | case 'n': |
| 2279 | str = append(str, '\n') |
| 2280 | case 'r': |
| 2281 | str = append(str, '\r') |
| 2282 | case 't': |
| 2283 | str = append(str, '\t') |
| 2284 | case '"': |
| 2285 | str = append(str, '"') |
| 2286 | case 'u': |
| 2287 | if i+5 > len(json) { |
| 2288 | return string(str) |
| 2289 | } |
| 2290 | r := runeit(json[i+1:]) |
| 2291 | i += 5 |
| 2292 | if utf16.IsSurrogate(r) { |
| 2293 | // need another code |
| 2294 | if len(json[i:]) >= 6 && json[i] == '\\' && |
| 2295 | json[i+1] == 'u' { |
| 2296 | // we expect it to be correct so just consume it |
| 2297 | r = utf16.DecodeRune(r, runeit(json[i+2:])) |
| 2298 | i += 6 |
| 2299 | } |
| 2300 | } |
| 2301 | // provide enough space to encode the largest utf8 possible |
| 2302 | str = append(str, 0, 0, 0, 0, 0, 0, 0, 0) |
| 2303 | n := utf8.EncodeRune(str[len(str)-8:], r) |
| 2304 | str = str[:len(str)-8+n] |
| 2305 | i-- // backtrack index by one |
| 2306 | } |
| 2307 | } |
| 2308 | } |
| 2309 | return string(str) |
| 2310 | } |
| 2311 |
searching dependent graphs…