code: func UTF8encode(raw string, sourceCharset string) string {
  	enc, name := charset.Lookup(sourceCharset)
  	if nil == enc {
  		log.Println("Cannot convert from", sourceCharset, ":", name)
  		return raw
  	}
  
  	dst := make([]byte, len(raw))
  	d := enc.NewDecoder()
  
  	var (
  		in  int
  		out int
  	)
  	for in < len(raw) {
  		// Do the transformation
  		ndst, nsrc, err := d.Transform(dst[out:], []byte(raw[in:]), true)
  		in += nsrc
  		out += ndst
  		if err == nil {
  			// Completed transformation
  			break
  		}
  		if err == transform.ErrShortDst {
  			// Our output buffer is too small, so we need to grow it
  			t := make([]byte, (cap(dst)+1)*2)
  			copy(t, dst)
  			dst = t
  			continue
  		}
  		// We're here because of at least one illegal character. Skip over the current rune
  		// and try again.
  		_, width := utf8.DecodeRuneInString(raw[in:])
  		in += width
  	}
  	return string(dst)
  }
docs: // UTF8encode converts a string from the source character set to UTF-8, skipping invalid byte sequences
  // @see http://stackoverflow.com/questions/32512500/ignore-illegal-bytes-when-decoding-text-with-go