decodeNulInString reverses encodeNulInString: U+E000 U+E000 becomes U+E000, and U+E000 U+E001 becomes NUL.
(s string)
| 1661 | // decodeNulInString reverses encodeNulInString: U+E000 U+E000 |
| 1662 | // becomes U+E000, and U+E000 U+E001 becomes NUL. |
| 1663 | func decodeNulInString(s string) string { |
| 1664 | if !strings.ContainsRune(s, '\uE000') { |
| 1665 | return s |
| 1666 | } |
| 1667 | var b strings.Builder |
| 1668 | b.Grow(len(s)) |
| 1669 | runes := []rune(s) |
| 1670 | for i := 0; i < len(runes); i++ { |
| 1671 | if runes[i] == '\uE000' && i+1 < len(runes) { |
| 1672 | switch runes[i+1] { |
| 1673 | case '\uE000': |
| 1674 | _, _ = b.WriteRune('\uE000') |
| 1675 | i++ |
| 1676 | case '\uE001': |
| 1677 | _, _ = b.WriteRune(0) |
| 1678 | i++ |
| 1679 | default: |
| 1680 | // Unpaired sentinel, preserve as-is. |
| 1681 | _, _ = b.WriteRune(runes[i]) |
| 1682 | } |
| 1683 | } else { |
| 1684 | _, _ = b.WriteRune(runes[i]) |
| 1685 | } |
| 1686 | } |
| 1687 | return b.String() |
| 1688 | } |
| 1689 | |
| 1690 | // encodeNulInValue recursively walks a JSON value (as produced |
| 1691 | // by json.Unmarshal with UseNumber) and applies |
no test coverage detected