diff -pruN aspseek-1.2.10/include/ucharset.h aspseek-1.2.10-utf_fix/include/ucharset.h
--- aspseek-1.2.10/include/ucharset.h	2002-06-08 22:52:41.000000000 +0700
+++ aspseek-1.2.10-utf_fix/include/ucharset.h	2004-04-06 18:17:12.000000000 +0700
@@ -650,9 +650,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;
@@ -664,12 +671,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
@@ -684,6 +694,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;
 }
 

