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