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