function strlen (string)
{  
	var str = string+'';  
	var i = 0, chr = '', lgth = 0;  
	var getWholeChar = function (str, i)
	{  
		var code = str.charCodeAt(i);  
		var next = '', prev = '';  
		if (0xD800 <= code && code <= 0xDBFF)
		{ // High surrogate(could change last hex to 0xDB7F to treat high private surrogates as single characters)  
			if (str.length <= (i+1))
			{
				throw 'High surrogate without following low surrogate';  
			}  
			next = str.charCodeAt(i+1);  
			if (0xDC00 > next || next > 0xDFFF)
			{  
				throw 'High surrogate without following low surrogate';  
			}  
			return str[i]+str[i+1];  
		} 
		else if (0xDC00 <= code && code <= 0xDFFF)
		{ // Low surrogate  
			if (i === 0)
			{
				throw 'Low surrogate without preceding high surrogate';
			}
			prev = str.charCodeAt(i-1);
			if (0xD800 > prev || prev > 0xDBFF)
			{ //(could change last hex to 0xDB7F to treat high private surrogates as single characters)  
				throw 'Low surrogate without preceding high surrogate';  
			}  
			return false; // We can pass over low surrogates now as the second component in a pair which we have already processed  
		}  
		return str[i];  
	};  
	for (i=0, lgth=0; i < str.length; i++)
	{  
		if ((chr = getWholeChar(str, i)) === false)
		{  
			continue;  
		} // Adapt this line at the top of any loop, passing in the whole string and the current iteration and returning a variable to represent the individual character; purpose is to treat the first part of a surrogate pair as the whole character and then ignore the second part  
		lgth++;  
	}  
	return lgth;  
}