// the Unicode replacement code point U+FFFD.
func DecodeRune(r1, r2 rune) rune {
if surr1 <= r1 && r1 < surr2 && surr2 <= r2 && r2 < surr3 {
- return (r1-surr1)<<10 | (r2 - surr2) + 0x10000
+ return (r1-surr1)<<10 | (r2 - surr2) + surrSelf
}
return replacementChar
}
n := 0
for i := 0; i < len(s); i++ {
switch r := s[i]; {
+ case r < surr1, surr3 <= r:
+ // normal rune
+ a[n] = rune(r)
case surr1 <= r && r < surr2 && i+1 < len(s) &&
surr2 <= s[i+1] && s[i+1] < surr3:
// valid surrogate sequence
a[n] = DecodeRune(rune(r), rune(s[i+1]))
i++
- n++
- case surr1 <= r && r < surr3:
+ default:
// invalid surrogate sequence
a[n] = replacementChar
- n++
- default:
- // normal rune
- a[n] = rune(r)
- n++
}
+ n++
}
- return a[0:n]
+ return a[:n]
}