Source File
utf8.go
Belonging Package
unicode/utf8
package utf8
const (
RuneError = '\uFFFD' // the "error" Rune or "Unicode replacement character"
RuneSelf = 0x80 // characters below RuneSelf are represented as themselves in a single byte.
MaxRune = '\U0010FFFF' // Maximum valid Unicode code point.
UTFMax = 4 // maximum number of bytes of a UTF-8 encoded Unicode character.
)
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x00-0x0F
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x10-0x1F
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x20-0x2F
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x30-0x3F
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x40-0x4F
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x50-0x5F
as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, as, // 0x60-0x6F
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x80-0x8F
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0x90-0x9F
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xA0-0xAF
xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xB0-0xBF
xx, xx, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xC0-0xCF
s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, s1, // 0xD0-0xDF
s2, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s3, s4, s3, s3, // 0xE0-0xEF
s5, s6, s6, s6, s7, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, // 0xF0-0xFF
}
type acceptRange struct {
lo uint8 // lowest value for second byte.
hi uint8 // highest value for second byte.
}
var acceptRanges = [16]acceptRange{
0: {locb, hicb},
1: {0xA0, hicb},
2: {locb, 0x9F},
3: {0x90, hicb},
4: {locb, 0x8F},
}
:= rune() << 31 >> 31 // Create 0x0000 or 0xFFFF.
return rune([0])&^ | RuneError&, 1
}
:= int( & 7)
:= acceptRanges[>>4]
if < {
return RuneError, 1
}
:= [1]
if < .lo || .hi < {
return RuneError, 1
}
if <= 2 { // <= instead of == to help the compiler eliminate some bounds checks
return rune(&mask2)<<6 | rune(&maskx), 2
}
:= [2]
if < locb || hicb < {
return RuneError, 1
}
if <= 3 {
return rune(&mask3)<<12 | rune(&maskx)<<6 | rune(&maskx), 3
}
:= [3]
if < locb || hicb < {
return RuneError, 1
}
return rune(&mask4)<<18 | rune(&maskx)<<12 | rune(&maskx)<<6 | rune(&maskx), 4
}
:= rune() << 31 >> 31 // Create 0x0000 or 0xFFFF.
return rune([0])&^ | RuneError&, 1
}
:= int( & 7)
:= acceptRanges[>>4]
if < {
return RuneError, 1
}
:= [1]
if < .lo || .hi < {
return RuneError, 1
}
if <= 2 { // <= instead of == to help the compiler eliminate some bounds checks
return rune(&mask2)<<6 | rune(&maskx), 2
}
:= [2]
if < locb || hicb < {
return RuneError, 1
}
if <= 3 {
return rune(&mask3)<<12 | rune(&maskx)<<6 | rune(&maskx), 3
}
:= [3]
if < locb || hicb < {
return RuneError, 1
}
return rune(&mask4)<<18 | rune(&maskx)<<12 | rune(&maskx)<<6 | rune(&maskx), 4
}
:= - UTFMax
if < 0 {
= 0
}
for --; >= ; -- {
if RuneStart([]) {
break
}
}
if < 0 {
= 0
}
, = DecodeRune([:])
if + != {
return RuneError, 1
}
return ,
}
:= - UTFMax
if < 0 {
= 0
}
for --; >= ; -- {
if RuneStart([]) {
break
}
}
if < 0 {
= 0
}
, = DecodeRuneInString([:])
if + != {
return RuneError, 1
}
return ,
}
func ( rune) int {
switch {
case < 0:
return -1
case <= rune1Max:
return 1
case <= rune2Max:
return 2
case surrogateMin <= && <= surrogateMax:
return -1
case <= rune3Max:
return 3
case <= MaxRune:
return 4
}
return -1
}
switch := uint32(); {
case <= rune1Max:
[0] = byte()
return 1
case <= rune2Max:
_ = [1] // eliminate bounds checks
[0] = t2 | byte(>>6)
[1] = tx | byte()&maskx
return 2
case > MaxRune, surrogateMin <= && <= surrogateMax:
= RuneError
fallthrough
case <= rune3Max:
_ = [2] // eliminate bounds checks
[0] = t3 | byte(>>12)
[1] = tx | byte(>>6)&maskx
[2] = tx | byte()&maskx
return 3
default:
_ = [3] // eliminate bounds checks
[0] = t4 | byte(>>18)
[1] = tx | byte(>>12)&maskx
[2] = tx | byte(>>6)&maskx
[3] = tx | byte()&maskx
return 4
}
}
++
continue
}
:= first[]
if == xx {
++ // invalid.
continue
}
:= int( & 7)
if + > {
++ // Short or invalid.
continue
}
:= acceptRanges[>>4]
if := [+1]; < .lo || .hi < {
= 1
} else if == 2 {
} else if := [+2]; < locb || hicb < {
= 1
} else if == 3 {
} else if := [+3]; < locb || hicb < {
= 1
}
+=
}
return
}
++
continue
}
:= first[]
if == xx {
++ // invalid.
continue
}
:= int( & 7)
if + > {
++ // Short or invalid.
continue
}
:= acceptRanges[>>4]
if := [+1]; < .lo || .hi < {
= 1
} else if == 2 {
} else if := [+2]; < locb || hicb < {
= 1
} else if == 3 {
} else if := [+3]; < locb || hicb < {
= 1
}
+=
}
return
}
break
}
= [8:]
}
:= len()
for := 0; < ; {
:= []
if < RuneSelf {
++
continue
}
:= first[]
if == xx {
return false // Illegal starter byte.
}
:= int( & 7)
if + > {
return false // Short or invalid.
}
:= acceptRanges[>>4]
if := [+1]; < .lo || .hi < {
return false
} else if == 2 {
} else if := [+2]; < locb || hicb < {
return false
} else if == 3 {
} else if := [+3]; < locb || hicb < {
return false
}
+=
}
return true
}
break
}
= [8:]
}
:= len()
for := 0; < ; {
:= []
if < RuneSelf {
++
continue
}
:= first[]
if == xx {
return false // Illegal starter byte.
}
:= int( & 7)
if + > {
return false // Short or invalid.
}
:= acceptRanges[>>4]
if := [+1]; < .lo || .hi < {
return false
} else if == 2 {
} else if := [+2]; < locb || hicb < {
return false
} else if == 3 {
} else if := [+3]; < locb || hicb < {
return false
}
+=
}
return true
}
func ( rune) bool {
switch {
case 0 <= && < surrogateMin:
return true
case surrogateMax < && <= MaxRune:
return true
}
return false
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |