my $len = $n >= 0xFC ? 5 : $n >= 0xF8 ? 4 : $n >= 0xF0 ? 3 : $n >= 0xE0 ? 2 : $n >= 0xC0 ? 1 : throw XML::SAX::Exception::Parse( Message => sprintf("Invalid character 0x%x", $n), ColumnNumber => $self->column, LineNumber => $self->line, PublicId => $self->public_id, SystemId => $self->system_id, ); if ($len <= length($self->[BUFFER])) { $current .= substr($self->[BUFFER], 0, $len, ''); $self->[CURRENT] = substr($self->[BUFFER], -1); } else { $len -= length($self->[BUFFER]); $current .= $self->[BUFFER]; $self->[BUFFER] = ''; while (-1 < --$len) { next($self); $current .= $self->[CURRENT]; } }