gitee.com/quant1x/gox@v1.7.6/text/encoding/gbk.go (about) 1 package encoding 2 3 // Converters for GBK encoding. 4 5 func init() { 6 RegisterCharset(&Charset{ 7 Name: "GBK", 8 NewDecoder: func() Decoder { 9 return decodeGBKRune 10 }, 11 NewEncoder: func() Encoder { 12 return encodeGBKRune 13 }, 14 }) 15 } 16 17 func decodeGBKRune(p []byte) (r rune, size int, status Status) { 18 if len(p) == 0 { 19 status = NO_ROOM 20 return 21 } 22 23 b := p[0] 24 if b < 128 { 25 return rune(b), 1, SUCCESS 26 } 27 28 if len(p) < 2 { 29 status = NO_ROOM 30 return 31 } 32 33 c := uint16(p[0])<<8 + uint16(p[1]) 34 r = rune(gbkToUnicode[c]) 35 if r == 0 { 36 r = gbkToUnicodeExtra[c] 37 } 38 39 if r != 0 { 40 return r, 2, SUCCESS 41 } 42 43 return 0xfffd, 1, INVALID_CHAR 44 } 45 46 func encodeGBKRune(p []byte, r rune) (size int, status Status) { 47 if len(p) == 0 { 48 status = NO_ROOM 49 return 50 } 51 52 if r < 128 { 53 p[0] = byte(r) 54 return 1, SUCCESS 55 } 56 57 if len(p) < 2 { 58 status = NO_ROOM 59 return 60 } 61 62 var c uint16 63 if r < 0x10000 { 64 c = unicodeToGBK[r] 65 } else { 66 c = unicodeToGBKExtra[r] 67 } 68 69 if c != 0 { 70 p[0] = byte(c >> 8) 71 p[1] = byte(c) 72 return 2, SUCCESS 73 } 74 75 p[0] = 0x1a 76 return 1, INVALID_CHAR 77 }