special

This webpage has been robot translated, sorry for typos if any. To view the original content of the page, simply replace the translation subdomain with www in the address bar or use this link.

Фукнции перекодировки 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;
}

Created/Updated: 25.05.2018

';>