gitee.com/quant1x/gox@v1.7.6/text/encoding/translate.go (about) 1 package encoding 2 3 import "unicode/utf8" 4 5 // Translate enables a Decoder to implement go-charset's Translator interface. 6 func (d Decoder) Translate(data []byte, eof bool) (n int, cdata []byte, err error) { 7 cdata = make([]byte, len(data)+1) 8 destPos := 0 9 10 for n < len(data) { 11 _rune, size, status := d(data[n:]) 12 13 switch status { 14 case STATE_ONLY: 15 n += size 16 continue 17 18 case NO_ROOM: 19 if !eof { 20 return n, cdata[:destPos], nil 21 } 22 _rune = 0xfffd 23 n = len(data) 24 25 default: 26 n += size 27 } 28 29 if _rune < 128 { 30 if destPos >= len(cdata) { 31 cdata = doubleLength(cdata) 32 } 33 cdata[destPos] = byte(_rune) 34 destPos++ 35 } else { 36 if destPos+utf8.RuneLen(_rune) > len(cdata) { 37 cdata = doubleLength(cdata) 38 } 39 destPos += utf8.EncodeRune(cdata[destPos:], _rune) 40 } 41 } 42 43 return n, cdata[:destPos], nil 44 } 45 46 func doubleLength(b []byte) []byte { 47 b2 := make([]byte, 2*len(b)) 48 copy(b2, b) 49 return b2 50 }