else if ((c & 0x60) == 0x40) // we know the top bit is set here
{
// two byte character
count += 2;
if (utflen != 0 && count > utflen)
throw new UTFDataFormatException();
char2 = in.readUnsignedByte();
if ((char2 & 0xC0) != 0x80)
throw new UTFDataFormatException();
actualChar = (char)(((c & 0x1F) << 6) | (char2 & 0x3F));
}
else if ((c & 0x70) == 0x60) // we know the top bit is set here
{
// three byte character
count += 3;
if (utflen != 0 && count > utflen)
throw new UTFDataFormatException();
char2 = in.readUnsignedByte();
char3 = in.readUnsignedByte();
if ((c == 0xE0) && (char2 == 0) && (char3 == 0)
&& (utflen == 0))
{
// we reached the end of a long string,
// that was terminated with
// (11100000, 00000000, 00000000)
break readingLoop;
}
if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80))
throw new UTFDataFormatException();
actualChar = (char)(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
}
else {
throw new UTFDataFormatException(
"Invalid code point: " + Integer.toHexString(c));
}
str[strlen++] = actualChar;
}