diff --git a/lib/modules/Parser.pmod/Pike.pmod b/lib/modules/Parser.pmod/Pike.pmod
index 2d5f67ea3e9fc5e1d39e7b31cf383ab227f28303..2733787ed13c4c12dea78a448f6b3d12436096b2 100644
--- a/lib/modules/Parser.pmod/Pike.pmod
+++ b/lib/modules/Parser.pmod/Pike.pmod
@@ -6,7 +6,7 @@ array(string) split(string data)
   int line=1;
   array(string) ret=({});
   int pos;
-  data+="\0";
+  data += "\n\0";	/* End sentinel. */
 
   while(1)
   {
@@ -29,10 +29,18 @@ array(string) split(string data)
 	  error("Failed to find end of preprocessor statement.\n");
 	
 	while(data[pos-1]=='\\') pos=search(data,"\n",pos+1);
+        sscanf(data[start..pos], 
+	       "#%*[ \t]charset%*[ \t\\]%s%*[ \n]", string charset);
+	if(charset)
+	  data = (data[0..pos]+
+		  master()->decode_charset(data[pos+1..sizeof(data)-3], 
+					   charset)
+		  +"\n\0");  // New end sentinel.
 	break;
 
       case 'a'..'z':
       case 'A'..'Z':
+      case 128..:     // Lets simplify things for now...
       case '_':
 	while(1)
 	{
@@ -41,6 +49,7 @@ array(string) split(string data)
 	    case 'a'..'z':
 	    case 'A'..'Z':
 	    case '0'..'9':
+	    case 128..:      // Lets simplify things for now...
 	    case '_':
 	      pos++;
 	      continue;
@@ -88,7 +97,8 @@ array(string) split(string data)
 	break;
 
       default:
-	werror("Unknown token %s\n",data[pos..pos+5]);
+	werror("%O\n",ret);
+	werror("Unknown token %O\n",data[pos..pos+20]);
 	exit(1);
 
       case  '`':