Фукнции перекодировки UTF8-Win, Win-UTF8

Иногда случаются такие моменты, когда в php нужно перекодировать данные из одной кодировки в другую.

В данной статье опишем несколько функций, которые я сам не раз использовал.

Функции и скрипты написаны не мной, но успешно работают и часто помогают при php-javascript взаимодействиях.

Итак, перекодировка из utf-8 в windows-1251 и обратно:

Функция первая из utf8 в cp1251

function utf8_win1($s) {
$s=strtr($s,array("\xD0\xB0"=>"а", "\xD0\x90"=>"А", "\xD0\xB1"=>"б", "\xD0\x91"=>"Б",
 "\xD0\xB2"=>"в", "\xD0\x92"=>"В", "\xD0\xB3"=>"г", "\xD0\x93"=>"Г", "\xD0\xB4"=>"д",
 "\xD0\x94"=>"Д", "\xD0\xB5"=>"е", "\xD0\x95"=>"Е", "\xD1\x91"=>"ё", "\xD0\x81"=>"Ё",
 "\xD0\xB6"=>"ж", "\xD0\x96"=>"Ж", "\xD0\xB7"=>"з", "\xD0\x97"=>"З", "\xD0\xB8"=>"и",
 "\xD0\x98"=>"И", "\xD0\xB9"=>"й", "\xD0\x99"=>"Й", "\xD0\xBA"=>"к", "\xD0\x9A"=>"К",
 "\xD0\xBB"=>"л", "\xD0\x9B"=>"Л", "\xD0\xBC"=>"м", "\xD0\x9C"=>"М", "\xD0\xBD"=>"н",
 "\xD0\x9D"=>"Н", "\xD0\xBE"=>"о", "\xD0\x9E"=>"О", "\xD0\xBF"=>"п", "\xD0\x9F"=>"П",
 "\xD1\x80"=>"р", "\xD0\xA0"=>"Р", "\xD1\x81"=>"с", "\xD0\xA1"=>"С", "\xD1\x82"=>"т",
 "\xD0\xA2"=>"Т", "\xD1\x83"=>"у", "\xD0\xA3"=>"У", "\xD1\x84"=>"ф", "\xD0\xA4"=>"Ф",
 "\xD1\x85"=>"х", "\xD0\xA5"=>"Х", "\xD1\x86"=>"ц", "\xD0\xA6"=>"Ц", "\xD1\x87"=>"ч",
 "\xD0\xA7"=>"Ч", "\xD1\x88"=>"ш", "\xD0\xA8"=>"Ш", "\xD1\x89"=>"щ", "\xD0\xA9"=>"Щ",
 "\xD1\x8A"=>"ъ", "\xD0\xAA"=>"Ъ", "\xD1\x8B"=>"ы", "\xD0\xAB"=>"Ы", "\xD1\x8C"=>"ь",
 "\xD0\xAC"=>"Ь", "\xD1\x8D"=>"э", "\xD0\xAD"=>"Э", "\xD1\x8E"=>"ю", "\xD0\xAE"=>"Ю",
 "\xD1\x8F"=>"я", "\xD0\xAF"=>"Я"));
return $s;
}

Функция вторая из utf8 в cp1251

function utf8_win($s) {
$out = "";
$c1 = "";
$byte2 = false;
for ($c = 0; $c < strlen($s); $c ++){
$i = ord($s[$c]);
if ($i <= 127) $out .= $s[$c];
		if ($byte2) {
			$new_c2 = ($c1 & 3) * 64 + ($i & 63);
			$new_c1 = ($c1 >> 2) & 5;
			$new_i = $new_c1 * 256 + $new_c2;
			if ($new_i == 1025){
				$out_i = 168;
			}else {
				if ($new_i == 1105){
					$out_i = 184;
				}else {
					$out_i = $new_i-848;
				}
			}
			$out .= chr($out_i);
			$byte2 = false;
		}
		if (($i >> 5) == 6) {
			$c1 = $i;
			$byte2 = true;
		}
	}
	return $out;
}

Функция первая из windows-1251 в utf-8

function win_utf8($in_text) { 
 $output = "";
 $other[1025] = "Ё";
 $other[1105] = "ё";
 $other[1028] = "Є";
 $other[1108] = "є";
 $other[1030] = "I";
 $other[1110] = "i";
 $other[1031] = "Ї";
 $other[1111] = "ї";
 for ($i = 0; $i < strlen($in_text); $i++){
 if (ord($in_text{$i}) > 191) {
 $output.="&#".(ord($in_text{$i})+848).";";
 }else {
 if (array_search($in_text{$i}, $other)===false){
 $output.=$in_text{$i};
 }else {
 $output.="&#".array_search($in_text{$i}, $other).";";
 }
 }
 }
 return $output;
}

Функция перекодировки из windows-1251 в utf-8

Ранее пользовался iconv(“CP1251?, “UTF-8?, $text_for_convert), но, как известно iconv даёт большую нагрузку на сервер и работает медленнее чем представленная ниже функция.

Отказаться от iconv вынудило еще то, что в определенный момент при перекодировании из windows-1251 в UTF-8 без видимых причин, данная функция стала возвращать пустую строку.

!!! Если поменять местами $in_arr и $out_arr, то функция заработает “в обратном направлении”, т.е. будет преобразовывать UTF-8 в CP-1251.

function cp1251_to_utf8 ($txt) {
 $in_arr = array (
 chr(208), chr(192), chr(193), chr(194),
 chr(195), chr(196), chr(197), chr(168),
 chr(198), chr(199), chr(200), chr(201),
 chr(202), chr(203), chr(204), chr(205),
 chr(206), chr(207), chr(209), chr(210),
 chr(211), chr(212), chr(213), chr(214),
 chr(215), chr(216), chr(217), chr(218),
 chr(219), chr(220), chr(221), chr(222),
 chr(223), chr(224), chr(225), chr(226),
 chr(227), chr(228), chr(229), chr(184),
 chr(230), chr(231), chr(232), chr(233),
 chr(234), chr(235), chr(236), chr(237),
 chr(238), chr(239), chr(240), chr(241),
 chr(242), chr(243), chr(244), chr(245),
 chr(246), chr(247), chr(248), chr(249),
 chr(250), chr(251), chr(252), chr(253),
 chr(254), chr(255)
 ); 
 
 $out_arr = array (
 chr(208).chr(160), chr(208).chr(144), chr(208).chr(145),
 chr(208).chr(146), chr(208).chr(147), chr(208).chr(148),
 chr(208).chr(149), chr(208).chr(129), chr(208).chr(150),
 chr(208).chr(151), chr(208).chr(152), chr(208).chr(153),
 chr(208).chr(154), chr(208).chr(155), chr(208).chr(156),
 chr(208).chr(157), chr(208).chr(158), chr(208).chr(159),
 chr(208).chr(161), chr(208).chr(162), chr(208).chr(163),
 chr(208).chr(164), chr(208).chr(165), chr(208).chr(166),
 chr(208).chr(167), chr(208).chr(168), chr(208).chr(169),
 chr(208).chr(170), chr(208).chr(171), chr(208).chr(172),
 chr(208).chr(173), chr(208).chr(174), chr(208).chr(175),
 chr(208).chr(176), chr(208).chr(177), chr(208).chr(178),
 chr(208).chr(179), chr(208).chr(180), chr(208).chr(181),
 chr(209).chr(145), chr(208).chr(182), chr(208).chr(183),
 chr(208).chr(184), chr(208).chr(185), chr(208).chr(186),
 chr(208).chr(187), chr(208).chr(188), chr(208).chr(189),
 chr(208).chr(190), chr(208).chr(191), chr(209).chr(128),
 chr(209).chr(129), chr(209).chr(130), chr(209).chr(131),
 chr(209).chr(132), chr(209).chr(133), chr(209).chr(134),
 chr(209).chr(135), chr(209).chr(136), chr(209).chr(137),
 chr(209).chr(138), chr(209).chr(139), chr(209).chr(140),
 chr(209).chr(141), chr(209).chr(142), chr(209).chr(143)
 ); 
 
 $txt = str_replace($in_arr,$out_arr,$txt);
 return $txt;
}