Revision: 14536 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14536 Author: khughes Date: 2008-04-24 20:54:59 +0200 (Thu, 24 Apr 2008)
Log Message: ----------- Interface --------- Bugfix #9222. Conversion from UTF-8 to wchar for international fonts did not check for valid encodings, so user strings with containing invalid characters could cause crashes. Modified Paths: -------------- trunk/blender/source/blender/ftfont/intern/FTF_TTFont.cpp Modified: trunk/blender/source/blender/ftfont/intern/FTF_TTFont.cpp =================================================================== --- trunk/blender/source/blender/ftfont/intern/FTF_TTFont.cpp 2008-04-23 21:48:17 UTC (rev 14535) +++ trunk/blender/source/blender/ftfont/intern/FTF_TTFont.cpp 2008-04-24 18:54:59 UTC (rev 14536) @@ -48,49 +48,63 @@ #define FTF_MAX_STR_SIZE 512 +/* Converts Unicode to wchar +According to RFC 3629 "UTF-8, a transformation format of ISO 10646" +(http://tools.ietf.org/html/rfc3629), the valid UTF-8 encoding are: + + Char. number range | UTF-8 octet sequence + (hexadecimal) | (binary) + --------------------+--------------------------------------------- + 0000 0000-0000 007F | 0xxxxxxx + 0000 0080-0000 07FF | 110xxxxx 10xxxxxx + 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx + 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + +If the encoding incidated by the first character is incorrect (because the +1 to 3 following characters do not match 10xxxxxx), the output is a '?' and +only a single input character is consumed. + +*/ + int utf8towchar(wchar_t *w, char *c) { - int len=0; - if(w==NULL || c==NULL) return(0); - //printf("%s\n",c); - while(*c) - { - //Converts Unicode to wchar: + int len=0; - if(*c & 0x80) - { - if(*c & 0x40) - { - if(*c & 0x20) - { - if(*c & 0x10) - { - *w=(c[0] & 0x0f)<<18 | (c[1]&0x1f)<<12 | (c[2]&0x3f)<<6 | (c[3]&0x7f); - c++; - } - else - *w=(c[0] & 0x1f)<<12 | (c[1]&0x3f)<<6 | (c[2]&0x7f); - c++; - } - else - *w=(c[0] &0x3f)<<6 | c[1]&0x7f; - c++; - } - else - *w=(c[0] & 0x7f); - } - else - *w=(c[0] & 0x7f); + if(w==NULL || c==NULL) return(0); - c++; - w++; - len++; - } - return len; + while(*c) { + if ((*c & 0xe0) == 0xc0) { + if((c[1] & 0x80) && (c[1] & 0x40) == 0x00) { + *w=(c[0] &0x1f)<<6 | c[1]&0x3f; + c++; + } else { + *w = '?'; + } + } else if ((*c & 0xf0) == 0xe0) { + if((c[1] & c[2] & 0x80) && ((c[1] | c[2]) & 0x40) == 0x00) { + *w=(c[0] & 0x0f)<<12 | (c[1]&0x3f)<<6 | (c[2]&0x3f); + c += 2; + } else { + *w = '?'; + } + } else if ((*c & 0xf8) == 0xf0) { + if((c[1] & c[2] & c[3] & 0x80) && ((c[1] | c[2] | c[3]) & 0x40) == 0x00) { + *w=(c[0] & 0x07)<<18 | (c[1]&0x1f)<<12 | (c[2]&0x3f)<<6 | (c[3]&0x3f); + c += 3; + } else { + *w = '?'; + } + } else + *w=(c[0] & 0x7f); + + c++; + w++; + len++; + } + return len; } - FTF_TTFont::FTF_TTFont(void) { #ifdef __APPLE__ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs