fix
This commit is contained in:
+29
-39
@@ -858,48 +858,40 @@ bool regex(CString pattern, CString str)
|
|||||||
/* UTF-8 decoding code from glib. */
|
/* UTF-8 decoding code from glib. */
|
||||||
char *utf8_find_next_char (const char *p, const char *end)
|
char *utf8_find_next_char (const char *p, const char *end)
|
||||||
{
|
{
|
||||||
if (*p) {
|
if (end)
|
||||||
if (end)
|
for (++p; p < end && (*p & 0xc0) == 0x80; ++p)
|
||||||
for (++p; p < end && (*p & 0xc0) == 0x80; ++p)
|
;
|
||||||
;
|
else if (*p) {
|
||||||
else
|
for (++p; (*p & 0xc0) == 0x80; ++p)
|
||||||
for (++p; (*p & 0xc0) == 0x80; ++p)
|
;
|
||||||
;
|
}
|
||||||
}
|
return (p == end) ? NULL : (char *)p;
|
||||||
return (p == end) ? NULL : (char *)p;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define UTF8_GET \
|
int masks[7] = { 0, 0x7f, 0x1f, 0x0f, 0x07, 0x03, 0x01 };
|
||||||
|
|
||||||
|
int utf8_get_char_len (const char *pp)
|
||||||
|
{
|
||||||
|
const unsigned char *p = (const unsigned char *) pp;
|
||||||
|
if (*p < 128) return 1;
|
||||||
|
else if ((*p & 0xe0) == 0xc0) return 2;
|
||||||
|
else if ((*p & 0xf0) == 0xe0) return 3;
|
||||||
|
else if ((*p & 0xf8) == 0xf0) return 4;
|
||||||
|
else if ((*p & 0xfc) == 0xf8) return 5;
|
||||||
|
else if ((*p & 0xfe) == 0xfc) return 6;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
longchar utf8_get_char (const char *p)
|
longchar utf8_get_char (const char *p)
|
||||||
{
|
{
|
||||||
int i, mask = 0, len;
|
int len = utf8_get_char_len(p);
|
||||||
longchar result;
|
if(len == -1)
|
||||||
unsigned char c = (unsigned char) *p;
|
return 0xFFFF;
|
||||||
|
|
||||||
if (c < 128) {
|
int mask = masks[len];
|
||||||
len = 1;
|
|
||||||
mask = 0x7f;
|
|
||||||
} else if ((c & 0xe0) == 0xc0) {
|
|
||||||
len = 2;
|
|
||||||
mask = 0x1f;
|
|
||||||
} else if ((c & 0xf0) == 0xe0) {
|
|
||||||
len = 3;
|
|
||||||
mask = 0x0f;
|
|
||||||
} else if ((c & 0xf8) == 0xf0) {
|
|
||||||
len = 4;
|
|
||||||
mask = 0x07;
|
|
||||||
} else if ((c & 0xfc) == 0xf8) {
|
|
||||||
len = 5;
|
|
||||||
mask = 0x03;
|
|
||||||
} else if ((c & 0xfe) == 0xfc) {
|
|
||||||
len = 6;
|
|
||||||
mask = 0x01;
|
|
||||||
} else
|
|
||||||
return (longchar)-1;
|
|
||||||
|
|
||||||
result = longchar(p[0] & mask);
|
longchar result = longchar(p[0] & mask);
|
||||||
for (i = 1; i < len; ++i) {
|
for (int i = 1; i < len; ++i) {
|
||||||
if ((p[i] & 0xc0) != 0x80)
|
if ((p[i] & 0xc0) != 0x80)
|
||||||
return (longchar) -1;
|
return (longchar) -1;
|
||||||
|
|
||||||
@@ -916,12 +908,10 @@ lstring CStringToLstring(const CString &str)
|
|||||||
|
|
||||||
lstring ret;
|
lstring ret;
|
||||||
|
|
||||||
while(ptr)
|
while(ptr && ptr != end)
|
||||||
{
|
{
|
||||||
longchar c = utf8_get_char (ptr);
|
longchar c = utf8_get_char (ptr);
|
||||||
if(c != longchar(-1))
|
ret.push_back(c);
|
||||||
ret.push_back(c);
|
|
||||||
|
|
||||||
ptr = utf8_find_next_char (ptr, end);
|
ptr = utf8_find_next_char (ptr, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user