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.
This commit is contained in:
parent
f4cc03b0f1
commit
28c2d1b2ae
@ -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__
|
||||
|
Loading…
Reference in New Issue
Block a user