|
|
@ -44,7 +44,7 @@ var (
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
var (
|
|
|
|
startByteTable = map[int]int{
|
|
|
|
startByteTable = map[byte]int{
|
|
|
|
0b00000000: 7,
|
|
|
|
0b00000000: 7,
|
|
|
|
0b10000000: 6,
|
|
|
|
0b10000000: 6,
|
|
|
|
0b11000000: 5,
|
|
|
|
0b11000000: 5,
|
|
|
@ -59,13 +59,13 @@ var (
|
|
|
|
4: 21,
|
|
|
|
4: 21,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
oneByteEncode = []int{0b00000000}
|
|
|
|
oneByteEncode = []byte{0b00000000}
|
|
|
|
twoByteEncode = []int{0b11000000, 0b10000000}
|
|
|
|
twoByteEncode = []byte{0b11000000, 0b10000000}
|
|
|
|
threeByteEncode = []int{0b11100000, 0b10000000, 0b10000000}
|
|
|
|
threeByteEncode = []byte{0b11100000, 0b10000000, 0b10000000}
|
|
|
|
fourByteEncode = []int{0b11110000, 0b10000000, 0b10000000, 0b10000000}
|
|
|
|
fourByteEncode = []byte{0b11110000, 0b10000000, 0b10000000, 0b10000000}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
func getStartBytes(value int) ([]int, error) {
|
|
|
|
func getStartBytes(value int) ([]byte, error) {
|
|
|
|
if 0 <= value && value <= 0x7F {
|
|
|
|
if 0 <= value && value <= 0x7F {
|
|
|
|
return oneByteEncode, nil
|
|
|
|
return oneByteEncode, nil
|
|
|
|
} else if 0x80 <= value && value <= 0x7FF {
|
|
|
|
} else if 0x80 <= value && value <= 0x7FF {
|
|
|
@ -79,7 +79,7 @@ func getStartBytes(value int) ([]int, error) {
|
|
|
|
return nil, ErrInvalidWidth
|
|
|
|
return nil, ErrInvalidWidth
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func convertCodepoint(value int, startBytes []int) ([]byte, error) {
|
|
|
|
func convertCodepoint(value int, startBytes []byte) ([]byte, error) {
|
|
|
|
// Pad the required number of 0 bits to the left of the binary
|
|
|
|
// Pad the required number of 0 bits to the left of the binary
|
|
|
|
// representation of the hex value. This is based on the width
|
|
|
|
// representation of the hex value. This is based on the width
|
|
|
|
// (1, 2, 3, or 4) which is the same as the length of the starting
|
|
|
|
// (1, 2, 3, or 4) which is the same as the length of the starting
|
|
|
@ -101,12 +101,11 @@ func convertCodepoint(value int, startBytes []int) ([]byte, error) {
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
value := int(uintValue)
|
|
|
|
value := byte(uintValue)
|
|
|
|
|
|
|
|
|
|
|
|
// Use an or operation to store the significant bytes of
|
|
|
|
// Use an or operation to store the significant bytes of
|
|
|
|
// the value into the remaining bits of the start byte.
|
|
|
|
// the value into the remaining bits of the start byte.
|
|
|
|
utf8Byte := byte(currStartByte | value)
|
|
|
|
utf8Bytes = append(utf8Bytes, currStartByte|value)
|
|
|
|
utf8Bytes = append(utf8Bytes, utf8Byte)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Slice the bits we just used off the codepoint binary
|
|
|
|
// Slice the bits we just used off the codepoint binary
|
|
|
|
// string.
|
|
|
|
// string.
|
|
|
|