Главная » Шпаргалка » PHP MYSQL javascript » PHP » UTF-8 в Win1251

конвертация UTF-8 cp1251

Столкнулся с проблемой после переноса сайта на другой хост перестал работать iconv, выдавал пустое значение.
Возможно какие то у хоста ограничения или для работы коректно iconv нужно какие то кодировки настраивать на серваке не разбирался.
По гуглив и перепробовав массу вариантов у которых была проблема с украинскими символами , спец символами и даже выдавали 500 (срабатывали ограничения хоста)
Нашел такие варианты которые более менее заменили мне iconv.

Мне нужно было UTF-8 перегнать в win1251 использовал “Вариант4” с обработчиком “Битый UTF-8 “ . Обработчик удалял битый текст и спец символы которые в вин1251 аброкатабру выводили ну а вариант 3 переводил текст в win1251 с корректными символами украинского языка «і,І,ї,Ї…»


Вариант 1:

<?php
$_utf8win1251 = array(
"\xD0\x90"=>"\xC0","\xD0\x91"=>"\xC1","\xD0\x92"=>"\xC2","\xD0\x93"=>"\xC3","\xD0\x94"=>"\xC4",
"\xD0\x95"=>"\xC5","\xD0\x81"=>"\xA8","\xD0\x96"=>"\xC6","\xD0\x97"=>"\xC7","\xD0\x98"=>"\xC8",
"\xD0\x99"=>"\xC9","\xD0\x9A"=>"\xCA","\xD0\x9B"=>"\xCB","\xD0\x9C"=>"\xCC","\xD0\x9D"=>"\xCD",
"\xD0\x9E"=>"\xCE","\xD0\x9F"=>"\xCF","\xD0\xA0"=>"\xD0","\xD0\xA1"=>"\xD1","\xD0\xA2"=>"\xD2",
"\xD0\xA3"=>"\xD3","\xD0\xA4"=>"\xD4","\xD0\xA5"=>"\xD5","\xD0\xA6"=>"\xD6","\xD0\xA7"=>"\xD7",
"\xD0\xA8"=>"\xD8","\xD0\xA9"=>"\xD9","\xD0\xAA"=>"\xDA","\xD0\xAB"=>"\xDB","\xD0\xAC"=>"\xDC",
"\xD0\xAD"=>"\xDD","\xD0\xAE"=>"\xDE","\xD0\xAF"=>"\xDF","\xD0\x87"=>"\xAF","\xD0\x86"=>"\xB2",
"\xD0\x84"=>"\xAA","\xD0\x8E"=>"\xA1","\xD0\xB0"=>"\xE0","\xD0\xB1"=>"\xE1","\xD0\xB2"=>"\xE2",
"\xD0\xB3"=>"\xE3","\xD0\xB4"=>"\xE4","\xD0\xB5"=>"\xE5","\xD1\x91"=>"\xB8","\xD0\xB6"=>"\xE6",
"\xD0\xB7"=>"\xE7","\xD0\xB8"=>"\xE8","\xD0\xB9"=>"\xE9","\xD0\xBA"=>"\xEA","\xD0\xBB"=>"\xEB",
"\xD0\xBC"=>"\xEC","\xD0\xBD"=>"\xED","\xD0\xBE"=>"\xEE","\xD0\xBF"=>"\xEF","\xD1\x80"=>"\xF0",
"\xD1\x81"=>"\xF1","\xD1\x82"=>"\xF2","\xD1\x83"=>"\xF3","\xD1\x84"=>"\xF4","\xD1\x85"=>"\xF5",
"\xD1\x86"=>"\xF6","\xD1\x87"=>"\xF7","\xD1\x88"=>"\xF8","\xD1\x89"=>"\xF9","\xD1\x8A"=>"\xFA",
"\xD1\x8B"=>"\xFB","\xD1\x8C"=>"\xFC","\xD1\x8D"=>"\xFD","\xD1\x8E"=>"\xFE","\xD1\x8F"=>"\xFF",
"\xD1\x96"=>"\xB3","\xD1\x97"=>"\xBF","\xD1\x94"=>"\xBA","\xD1\x9E"=>"\xA2");
$_win1251utf8 = array(
"\xC0"=>"\xD0\x90","\xC1"=>"\xD0\x91","\xC2"=>"\xD0\x92","\xC3"=>"\xD0\x93","\xC4"=>"\xD0\x94",
"\xC5"=>"\xD0\x95","\xA8"=>"\xD0\x81","\xC6"=>"\xD0\x96","\xC7"=>"\xD0\x97","\xC8"=>"\xD0\x98",
"\xC9"=>"\xD0\x99","\xCA"=>"\xD0\x9A","\xCB"=>"\xD0\x9B","\xCC"=>"\xD0\x9C","\xCD"=>"\xD0\x9D",
"\xCE"=>"\xD0\x9E","\xCF"=>"\xD0\x9F","\xD0"=>"\xD0\xA0","\xD1"=>"\xD0\xA1","\xD2"=>"\xD0\xA2",
"\xD3"=>"\xD0\xA3","\xD4"=>"\xD0\xA4","\xD5"=>"\xD0\xA5","\xD6"=>"\xD0\xA6","\xD7"=>"\xD0\xA7",
"\xD8"=>"\xD0\xA8","\xD9"=>"\xD0\xA9","\xDA"=>"\xD0\xAA","\xDB"=>"\xD0\xAB","\xDC"=>"\xD0\xAC",
"\xDD"=>"\xD0\xAD","\xDE"=>"\xD0\xAE","\xDF"=>"\xD0\xAF","\xAF"=>"\xD0\x87","\xB2"=>"\xD0\x86",
"\xAA"=>"\xD0\x84","\xA1"=>"\xD0\x8E","\xE0"=>"\xD0\xB0","\xE1"=>"\xD0\xB1","\xE2"=>"\xD0\xB2",
"\xE3"=>"\xD0\xB3","\xE4"=>"\xD0\xB4","\xE5"=>"\xD0\xB5","\xB8"=>"\xD1\x91","\xE6"=>"\xD0\xB6",
"\xE7"=>"\xD0\xB7","\xE8"=>"\xD0\xB8","\xE9"=>"\xD0\xB9","\xEA"=>"\xD0\xBA","\xEB"=>"\xD0\xBB",
"\xEC"=>"\xD0\xBC","\xED"=>"\xD0\xBD","\xEE"=>"\xD0\xBE","\xEF"=>"\xD0\xBF","\xF0"=>"\xD1\x80",
"\xF1"=>"\xD1\x81","\xF2"=>"\xD1\x82","\xF3"=>"\xD1\x83","\xF4"=>"\xD1\x84","\xF5"=>"\xD1\x85",
"\xF6"=>"\xD1\x86","\xF7"=>"\xD1\x87","\xF8"=>"\xD1\x88","\xF9"=>"\xD1\x89","\xFA"=>"\xD1\x8A",
"\xFB"=>"\xD1\x8B","\xFC"=>"\xD1\x8C","\xFD"=>"\xD1\x8D","\xFE"=>"\xD1\x8E","\xFF"=>"\xD1\x8F",
"\xB3"=>"\xD1\x96","\xBF"=>"\xD1\x97","\xBA"=>"\xD1\x94","\xA2"=>"\xD1\x9E");

function utf8_win1251($a) {
    global $_utf8win1251;
    if (is_array($a)){
        foreach ($a as $k => $v) {
            if (is_array($v)) {
                $a[$k] = utf8_win1251($v);
            } else {
                $a[$k] = strtr($v, $_utf8win1251);
            }
        }
        return $a;
    } else {
        return strtr($a, $_utf8win1251);
    }
}

function win1251_utf8($a) {
    global $_win1251utf8;
    if (is_array($a)){
        foreach ($a as $k=>$v) {
            if (is_array($v)) {
                $a[$k] = utf8_win1251($v);
            } else {
                $a[$k] = strtr($v, $_win1251utf8);
            }
        }
        return $a;
    } else {
        return strtr($a, $_win1251utf8);
    }
}
?>

Вариант 2:

<?php
function Utf8ToWin($fcontents) {
    $out = $c1 = '';
    $byte2 = false;
    for ($c = 0;$c < strlen($fcontents);$c++) {
        $i = ord($fcontents[$c]);
        if ($i <= 127) {
            $out .= $fcontents[$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;
}


# Пример использования
$fcontents = Utf8ToWin('Строка в кодировке UTF-8');
?>

Вариант 3:

<?php
function UTF8toCP1251($str){ // by SiMM, $table from http://ru.wikipedia.org/wiki/CP1251
  static $table = array("\xD0\x81" => "\xA8", // Ё
                        "\xD1\x91" => "\xB8", // ё
                        // украинские символы
                        "\xD0\x8E" => "\xA1", // Ў (У)
                        "\xD1\x9E" => "\xA2", // ў (у)
                        "\xD0\x84" => "\xAA", // Є (Э)
                        "\xD1\x94" => "\xBA", // є (э)
                        "\xD0\x87" => "\xAF", // Ї (I..)
                        "\xD1\x97" => "\xBF", // ї (i..)
                        "\xD0\x86" => "\xB2", // I (I)
                        "\xD1\x96" => "\xB3", // i (i)
                        "\xD2\x90" => "\xA5", // Ґ (Г')
                        "\xD2\x91" => "\xB4", // ґ (г')
                        // чувашские символы
                        "\xD3\x90" => "\x8C", // &#1232; (А)
                        "\xD3\x96" => "\x8D", // &#1238; (Е)
                        "\xD2\xAA" => "\x8E", // &#1194; (С)
                        "\xD3\xB2" => "\x8F", // &#1266; (У)
                        "\xD3\x91" => "\x9C", // &#1233; (а)
                        "\xD3\x97" => "\x9D", // &#1239; (е)
                        "\xD2\xAB" => "\x9E", // &#1195; (с)
                        "\xD3\xB3" => "\x9F", // &#1267; (у)
                       );
  return preg_replace('#([\xD0-\xD1])([\x80-\xBF])#se',
                      'isset($table["$0"]) ? $table["$0"] :
                       chr(ord("$2")+("$1" == "\xD0" ? 0x30 : 0x70))
                      ',
                      $str
                     );
}
?>

<?php
function CP1251toUTF8($str){ // (C) SiMM, $table from http://ru.wikipedia.org/wiki/CP1251
  static $table = array("\xA8" => "\xD0\x81", // Ё
                        "\xB8" => "\xD1\x91", // ё
                        // украинские символы
                        "\xA1" => "\xD0\x8E", // Ў (У)
                        "\xA2" => "\xD1\x9E", // ў (у)
                        "\xA5" => "\xD2\x90", // Ґ (Г')
                        "\xB4" => "\xD2\x91", // ґ (г')
                        "\xAA" => "\xD0\x84", // Є (Э)
                        "\xBA" => "\xD1\x94", // є (э)
                        "\xAF" => "\xD0\x87", // Ї (I..)
                        "\xBF" => "\xD1\x97", // ї (i..)
                        "\xB2" => "\xD0\x86", // I (I)
                        "\xB3" => "\xD1\x96", // i (i)
                        // чувашские символы
                        "\x8C" => "\xD3\x90", // &#1232; (A)
                        "\x8D" => "\xD3\x96", // &#1238; (E)
                        "\x8E" => "\xD2\xAA", // &#1194; (С)
                        "\x8F" => "\xD3\xB2", // &#1266; (У)
                        "\x9C" => "\xD3\x91", // &#1233; (а)
                        "\x9D" => "\xD3\x97", // &#1239; (е)
                        "\x9E" => "\xD2\xAB", // &#1195; (с)
                        "\x9F" => "\xD3\xB3", // &#1267; (у)
                       );
  return preg_replace('#[\x80-\xFF]#se',
                      ' "$0" >= "\xF0" ? "\xD1".chr(ord("$0")-0x70) :
                       ("$0" >= "\xC0" ? "\xD0".chr(ord("$0")-0x30) :
                        (isset($table["$0"]) ? $table["$0"] : "")
                       )',
                      $str
                     );
}
?>

Вариант 4:


function Utf8Win($str,$type="w")  {
    static $conv='';

    if (!is_array($conv))  {
        $conv = array();

        for($x=128;$x<=143;$x++)  {
            $conv['u'][]=chr(209).chr($x);
            $conv['w'][]=chr($x+112);

        }

        for($x=144;$x<=191;$x++)  {
            $conv['u'][]=chr(208).chr($x);
            $conv['w'][]=chr($x+48);
        }

        $conv['u'][]=chr(208).chr(129);
        $conv['w'][]=chr(168);
        $conv['u'][]=chr(209).chr(145);
        $conv['w'][]=chr(184);
        $conv['u'][]=chr(208).chr(135);
        $conv['w'][]=chr(175);
        $conv['u'][]=chr(209).chr(151);
        $conv['w'][]=chr(191);
        $conv['u'][]=chr(208).chr(134);
        $conv['w'][]=chr(178);
        $conv['u'][]=chr(209).chr(150);
        $conv['w'][]=chr(179);
        $conv['u'][]=chr(210).chr(144);
        $conv['w'][]=chr(165);
        $conv['u'][]=chr(210).chr(145);
        $conv['w'][]=chr(180);
        $conv['u'][]=chr(208).chr(132);
        $conv['w'][]=chr(170);
        $conv['u'][]=chr(209).chr(148);
        $conv['w'][]=chr(186);
        $conv['u'][]=chr(226).chr(132).chr(150);
        $conv['w'][]=chr(185);
    }

    if ($type == 'w') {
        return str_replace($conv['u'],$conv['w'],$str);
    } elseif ($type == 'u') {
        return str_replace($conv['w'], $conv['u'],$str);
    } else {
        return $str;
    }
}

 

   Как определить что текст в UTF-8:

<?php
function is_ruUTF8($str) { // Функция определяет "похожесть" строки на русскую UTF8 (C) SiMM
    return !preg_replace('#[\x00-\x7F]|\xD0[\x81\x90-\xBF]|\xD1[\x91\x80-\x8F]#s', '', $str );
}
?>

«Похожесть» в данном случае означает, что в ней не встречаются символы, отличные от символов нижней половины ASCII (0x00–0x7F) и символов основного русского алфавита, закодированных в UTF-8, т.е. символов Ё (0x401 в Unicode, или "\xD0\x81" в UTF-8), А-Я (0x410–0x42F/"\xD0\x90"-"\xD0\xBF") и ё (0x451/"\xD1\x91"), а-я (0x430–0x44F/"\xD1\x80"-"\xD1\x8F").

   Битый UTF-8:
Анализирует строку в UTF-8 и убирает «битые» символы.

<?php
    function Strip_Bad_UTF_8($str) { // (C) Si MM?, based on ru.wikipedia.org/wiki/Unicode
        $ret = '';
        for ($i = 0;$i < strlen($str);) {
        $tmp = $str{$i++};
        $ch = ord($tmp);
        if ($ch > 0x7F) {
        if ($ch < 0xC0) continue;
        elseif ($ch < 0xE0) $di = 1;
        elseif ($ch < 0xF0) $di = 2;
        elseif ($ch < 0xF8) $di = 3;
        elseif ($ch < 0xFC) $di = 4;
        elseif ($ch < 0xFE) $di = 5;
        else continue;


        for ($j = 0;$j < $di;$j++) {
        $tmp .= $ch = $str{$i + $j};
        $ch = ord($ch);
        if ($ch < 0x80 || $ch > 0xBF) continue 2;
        }
        $i += $di;
        }
        $ret .= $tmp;

      }
      return $ret;
    }
?>

спасибо гуглу и http://phpclub.ru/faq/encodings/encodings3