diff -pruN aspseek-cvs/include/ucharset.h aspseek-utf_fix/include/ucharset.h
--- aspseek-cvs/include/ucharset.h	2002-12-19 00:38:53.000000000 +0600
+++ aspseek-utf_fix/include/ucharset.h	2004-04-06 17:56:09.000000000 +0700
@@ -644,9 +644,16 @@ inline WORD UCode(const BYTE*& src)
 	{
 		return *src ? *src++ : 0;
 	}
-	if (src[0] < 0xE0)
+	else
+	if (src[0] < 0xC0)
+	{
+		src++;
+		return 0;
+	}
+	else
+	if ((src[0] & 0xE0) == 0xC0)
 	{
-		if (src[1] && (src[0] & 0x1F))
+		if ((src[1] & 0xC0) == 0x80)
 		{
 			ucode = ((src[0] & 0x1F) << 6) | (src[1] & 0x3F);
 			src += 2;
@@ -658,12 +665,15 @@ inline WORD UCode(const BYTE*& src)
 		}
 	}
 	else
+	if ((src[0] & 0xf0) == 0xE0)
 	{
-		if (src[1] && (src[0] & 0xF))
+		if ((src[1] & 0xC0) == 0x80)
 		{
-			if (src[2] && (src[1] & 0x3F))
+			if ((src[2] & 0xC0) == 0x80)
 			{
-				ucode = ((src[0] & 0xF) << 12) | ((src[1] & 0x3F) << 6) | (src[2] & 0x3F);
+				ucode = ((src[0] & 0x0F) << 12) |
+					((src[1] & 0x3F) << 6) |
+					(src[2] & 0x3F);
 				src += 3;
 			}
 			else
@@ -678,6 +688,39 @@ inline WORD UCode(const BYTE*& src)
 			return 0;
 		}
 	}
+	else
+	if ((src[0] & 0xF8) == 0xF0)
+	{
+		if ((src[1] & 0xC0) == 0x80)
+		{
+			if ((src[2] & 0xC0) == 0x80)
+			{
+				if ((src[3] & 0xC0) == 0x80)
+				{
+					ucode = ((src[0] & 0x07) << 18) |
+						((src[1] & 0x3F) << 12) |
+						((src[2] & 0x3F) << 6) |
+						(src[3] & 0x3F);
+					src += 4;
+				}
+				else
+				{
+					src += 3;
+					return 0;
+				}
+			}
+			else
+			{
+				src += 2;
+				return 0;
+			}
+		}
+		else
+		{
+			src++;
+			return 0;
+		}
+	}
 	return ucode;
 }
 

