public ByteVector putUTF8(final String s) {
		final int charLength = s.length();
		int len = length;
		if (len + 2 + charLength > data.length) {
			enlarge(2 + charLength);
		}
		final byte[] data = this.data;
		// optimistic algorithm: instead of computing the byte length and then
		// serializing the string (which requires two loops), we assume the byte
		// length is equal to char length (which is the most frequent case), and
		// we start serializing the string right away. During the serialization,
		// if we find that this assumption is wrong, we continue with the
		// general method.
		data[len++] = (byte) (charLength >>> 8);
		data[len++] = (byte) charLength;
		for (int i = 0; i < charLength; ++i) {
			final char c = s.charAt(i);
			if ((c >= '\001' && c <= '\177') || (c >= '\u4E00' && c <= '\u9FFF')) {
				data[len++] = (byte) c;
			} else {
				throw new UnsupportedOperationException();
			}
		}
		length = len;
		return this;
	}
Puts an UTF8 string into this byte vector. The byte vector is automatically
enlarged if necessary.

@param s a String.
@return this byte vector.
src/main/java/com/alibaba/fastjson/asm/ByteVector.java