+ string::const_iterator j = i;
+
+ UnicodeChar result = (*j++)&(mask-1);
+
+ unsigned k;
+ for(k=1; (k<bytes && j!=str.end() && (*j&0xC0)==0x80); ++k)
+ result = (result<<6) | ((*j++)&0x3F);
+
+ if(k<bytes)
+ result = error("Incomplete UTF-8 character");
+ else if(!(result>>(bytes*5-4)) || !(result>>7))
+ result = error("Denormalized UTF-8 multibyte sequence");
+ else if(result>0x10FFFF || (result>=0xD800 && result<=0xDFFF))
+ result = error("Invalid Unicode code point");
+
+ i = j;
+ return result;
+ }
+ else
+ return *i++;