| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 | package mahonia// Converters for GBK encoding.func init() {	RegisterCharset(&Charset{		Name:    "GBK",		Aliases: []string{"GB2312"}, // GBK is a superset of GB2312.		NewDecoder: func() Decoder {			return decodeGBKRune		},		NewEncoder: func() Encoder {			return encodeGBKRune		},	})}func decodeGBKRune(p []byte) (r rune, size int, status Status) {	if len(p) == 0 {		status = NO_ROOM		return	}	b := p[0]	if b < 128 {		return rune(b), 1, SUCCESS	}	if len(p) < 2 {		status = NO_ROOM		return	}	c := uint16(p[0])<<8 + uint16(p[1])	r = rune(gbkToUnicode[c])	if r == 0 {		r = gbkToUnicodeExtra[c]	}	if r != 0 {		return r, 2, SUCCESS	}	return 0xfffd, 1, INVALID_CHAR}func encodeGBKRune(p []byte, r rune) (size int, status Status) {	if len(p) == 0 {		status = NO_ROOM		return	}	if r < 128 {		p[0] = byte(r)		return 1, SUCCESS	}	if len(p) < 2 {		status = NO_ROOM		return	}	var c uint16	if r < 0x10000 {		c = unicodeToGBK[r]	} else {		c = unicodeToGBKExtra[r]	}	if c != 0 {		p[0] = byte(c >> 8)		p[1] = byte(c)		return 2, SUCCESS	}	p[0] = 0x1a	return 1, INVALID_CHAR}
 |