evg
Встретилась некоторая необходимость преобразования строки текста из UTF-8 в windows-1251 (при передаче данных по AJAX, данные передаются в кодировке UTF-8). Самое простое решение в php использовать функцию iconv, в виде:

		$txt = iconv ("UTF-8","windows-1251",$str);
Но ввиду того, что она доступна с версии PHP >= 4.0.5, возможности её использовния не было. Приходится прибегать к некоторым извращениям. Суть которых сводится к обработке строки с целью замены двухбайтной кодировки UTF-8 на однобайтную 1251.
Почитаем о UTF8 в wikipedia.
В результате, исследовав формат UTF-8, получим:

		//
		//преобразование из utf8 в win1251
		//evg 08.01.2010
		//
		function utf8_w1251($str)
		{
		$w="";		
		for($i=0;$i<strlen($str);$i++)
		{	
			$c1=ord($str[$i]);//берем код символа
			if($c1 <= 128){//до кода 128 все символа как в ASCII 
				$w.=chr($c1);
				continue;
			}
			$c2=ord($str[++$i]);//берем код следующего символа
			$c = (($c1 & 31) << 6) + ($c2 & 63); //а вот тут само преобразование
			if($c >= 1040 && $c <= 1103) //перебор русских кодов русских букв
			{
				$w.= chr(($c - 1040) + 192); //вычтем код буквы A в UTF-8 и прибавим его же в 1251
			}
			else
			{
				switch($c) //здесь заменим коды букв Ё и ё и других, не входящих в диапазон русских букв,
						//которых нам будет нужно 
				{
					case 0x0401:$w.="Ё";break;
					case 0x0451:$w.="ё";break;
				}
			}
		}
		return $w;
		}
	
	
Этот код не трудно переделать под любой другой язык программирования.

А вот нашел более раннюю мою функцию перекодировку строки посредством использования таблицы перекодировки и функции strtr:

$escape_table = array(
'%20'=>' ','%21'=>'!', '%2C'=>',', '%3A'=>':', '%3B'=>';','%u0410'=>'А','%u0411'=>'Б','%u0412'=>'В','%u0413'=>'Г',
'%u0414'=>'Д','%u0415'=>'Е','%u0401'=>'Ё','%u0416'=>'Ж','%u0417'=>'З','%u0418'=>'И','%u0419'=>'Й','%u041A'=>'К',
'%u041B'=>'Л','%u041C'=>'М','%u041D'=>'Н','%u041E'=>'О','%u041F'=>'П','%u0420'=>'Р','%u0421'=>'С','%u0422'=>'Т',
'%u0423'=>'У','%u0424'=>'Ф','%u0425'=>'Х','%u0426'=>'Ц','%u0427'=>'Ч','%u0428'=>'Ш','%u0429'=>'Щ','%u042A'=>'Ъ',
'%u042B'=>'Ы','%u042C'=>'Ь','%u042D'=>'Э','%u042E'=>'Ю','%u042F'=>'Я',
'%u0430'=>'а','%u0431'=>'б','%u0432'=>'в','%u0433'=>'г','%u0434'=>'д','%u0435'=>'е','%u0451'=>'ё','%u0436'=>'ж',
'%u0437'=>'з','%u0438'=>'и','%u0439'=>'й','%u043A'=>'к','%u043B'=>'л','%u043C'=>'м','%u043D'=>'н','%u043E'=>'о',
'%u043F'=>'п','%u0440'=>'р','%u0441'=>'с','%u0442'=>'т','%u0443'=>'у','%u0444'=>'ф','%u0445'=>'х','%u0446'=>'ц',
'%u0447'=>'ч','%u0448'=>'ш','%u0449'=>'щ','%u044A'=>'ъ','%u044B'=>'ы','%u044C'=>'ь','%u044D'=>'э','%u044E'=>'ю',
'%u044F'=>'я',
);

function unicode_escape($str)

{
	global $escape_table;
	$str = rawurldecode($str);
	return strtr($str, @$escape_table);
}

Коментарии