in hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Output.java [904:972]
public void writeString(String value)
throws IOException {
int offset = _offset;
byte[] buffer = _buffer;
if (SIZE <= offset + 16) {
flushBuffer();
offset = _offset;
}
if (value == null) {
buffer[offset++] = (byte) 'N';
_offset = offset;
} else {
int length = value.length();
int strOffset = 0;
while (length > 0x8000) {
int sublen = 0x8000;
offset = _offset;
if (SIZE <= offset + 16) {
flushBuffer();
offset = _offset;
}
// chunk can't end in high surrogate
char tail = value.charAt(strOffset + sublen - 1);
if (0xd800 <= tail && tail <= 0xdbff)
sublen--;
buffer[offset + 0] = (byte) BC_STRING_CHUNK;
buffer[offset + 1] = (byte) (sublen >> 8);
buffer[offset + 2] = (byte) (sublen);
_offset = offset + 3;
printString(value, strOffset, sublen);
length -= sublen;
strOffset += sublen;
}
offset = _offset;
if (SIZE <= offset + 16) {
flushBuffer();
offset = _offset;
}
if (length <= STRING_DIRECT_MAX) {
buffer[offset++] = (byte) (BC_STRING_DIRECT + length);
} else if (length <= STRING_SHORT_MAX) {
buffer[offset++] = (byte) (BC_STRING_SHORT + (length >> 8));
buffer[offset++] = (byte) (length);
} else {
buffer[offset++] = (byte) ('S');
buffer[offset++] = (byte) (length >> 8);
buffer[offset++] = (byte) (length);
}
_offset = offset;
printString(value, strOffset, length);
}
}