Нужно поменять кодировку utf-8 на windows-1251?


Рано или поздно перед программистом встанет задача перекодировки текста из utf-8 на windows-1251 (или cp1251 в unix формате). На например, такая необходимость возникает когда нужно отправить письмо в windows-1251, а текста хранятся в utf-8.

Можно использовать iconv. Например так:

Листинг 1. Функция iconv():

<?
echo iconv("utf-8", "windows-1251", "Пора переходить на cp-1251.");
?>

Если iconv не помогает, то тогда используем что либо из тучи самодельных функций конвертирования кодировок.

Ниже представлена лучшая функция – из всего что можно было найти в интернете по данной тематике. В любом случае – судить вам…
Просьба: отписываться о багах. Заранее спасибо.

Листинг 2. Функция для перекодировки из utf-8 в windows-1251:

<?
function _charset_utf8_win($s)
{
  $r='';
  $state=1;
  for ($i=0;$i<strlen($s);$i++) {="" $c="ord($s[$i]);" switch($state)="" case="" 1:="" not="" a="" special="" symbol="" if($c="">&lt;=127)
        {
          $r.=$s[$i];
        }
        else
        {
          if(($c&gt;&gt;5)==6)
          {
            $c1=$c;
            $state=2;
          }
          else
            $r.=chr(128);
        }
        break;
      case 2: //an utf-8 encoded symbol has been meet
        $new_c2=($c1&amp;3)*64+($c&amp;63);
        $new_c1=($c1&gt;&gt;2)&amp;5;
        $new_i=$new_c1*256+$new_c2;
        switch($new_i)
        {
          case   1025: $out_c='Ё'; break;
          case   1105: $out_c='ё'; break;
          case 0x00ab: $out_c='«'; break;
          case 0x00bb: $out_c='»'; break;
          default: $out_c=chr($new_i-848);
        }
        $r.=$out_c;
        $state=1;
        break;
    }
  }
  return $r;
}
?>

Если уж и это не подходит – попробуёте универсальный класс: ConvertCharset.class.php, который конвертирует любую кодировку в любую другую кодировку.

, , , , ,

  1. #1 by Ney on 09.11.2009 - 9:58 дп

    А ссылку на класс можно?

  2. #2 by rott on 09.11.2009 - 9:59 дп

    А если мне наоборот надо windows-1251,utf-8 выложете код тоже

  3. #3 by Гость on 09.11.2009 - 9:59 дп

    у вас код ошибочно высвечен, т.е. часть кода потеряна, его можно увидеть. если открыть исходный код страницы!

  4. #4 by delphiec on 09.11.2009 - 10:00 дп

    for ($i=0;$i>5)==6)
    Этой конструкци PHP не понимает
    Зачем столько выкладывать бесполезной информации?

  5. #5 by макес on 09.11.2009 - 10:00 дп

    2 delphiec:
    можно показать примерно где находится такой код на этой странице (кроме твоего комментария)?

  6. #6 by bitl on 09.11.2009 - 10:01 дп

    макес, повылазило чтоле?

  7. #7 by макес on 09.11.2009 - 10:01 дп

    bitl, в смысле???

  8. #8 by Константин on 09.11.2009 - 10:01 дп

    Левая функция!!! Не проходят символы &*()-+\_=|[];’:/.

  9. #9 by макес on 09.11.2009 - 10:02 дп

    Я не программист сильный, но какой смысл менять кодировку этих символов? разве они не стандартные?

  10. #10 by Ща on 09.11.2009 - 10:02 дп

    Ниже представлена лучшая функция – из всего что можно было найти в интернете по данной тематике.

    Сука, и это ЛУЧШАЯ ФУНКЦИЯ??? Там же дох СИНТАКСИЧЕСКИХ ошибок, бля, я уже не говорю о логических!!

  11. #11 by Дикс on 09.11.2009 - 10:03 дп

    лол

  12. #12 by Иван on 09.11.2009 - 10:03 дп

    из 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  191) {
    $output.="&amp;#".(ord($in_text{$i})+848).";";
    }else {
    if (array_search($in_text{$i}, $other)===false){
    $output.=$in_text{$i};
    }else {
    $output.="&amp;#".array_search($in_text{$i}, $other).";";
    }
    }
    }
    return $output;
    }
  13. #13 by M@ks on 09.11.2009 - 10:04 дп

    листинг не работает в нём ошибка

  14. #14 by Djoin on 09.11.2009 - 10:04 дп

    Ребят ну поменяйте ктонибудь for ($i=0;$i>5)==6) на правильную строчку

  15. #15 by xfile on 09.11.2009 - 10:05 дп

    Где ты эту строку видел?

    Вот урывок, Ты чтото попутал…

    for ($i=0;$i>5)==6)
    {

  16. #16 by Aznavur on 09.11.2009 - 10:05 дп

    бля тут кто то грамотный это придумывал… lol ахахахаххах

  17. #17 by novak on 09.11.2009 - 10:05 дп

    это что значит?

  18. #18 by lord80 on 09.02.2010 - 10:39 пп

    стандартная функция ConvertCharset.class.php
    скачать можно:
    http://dev.splitbrain.org/download/darcs/dokuwiki-convert/ConvertCharset.class.php

  19. #20 by sl4mmer on 28.06.2010 - 3:16 дп

    плакаль

    если не помогает иконв то можно и так- …
    mb_convert_encoding(‘Текст в 1251′,’utf-8′,’windows-1251′)

  20. #21 by Евгений on 07.09.2010 - 9:42 дп

    Вот еще функция перекодировки из UTF-8 в CP1251. Вот рабочая версия. Проверял, нормально перекодирует.

    function cp1251toutf8($text) {
    $text = str_replace(chr(208),chr(208).chr(160),$text); # Р
    $text = str_replace(chr(192),chr(208).chr(144),$text); # А
    $text = str_replace(chr(193),chr(208).chr(145),$text); # Б
    $text = str_replace(chr(194),chr(208).chr(146),$text); # В
    $text = str_replace(chr(195),chr(208).chr(147),$text); # Г
    $text = str_replace(chr(196),chr(208).chr(148),$text); # Д
    $text = str_replace(chr(197),chr(208).chr(149),$text); # Е
    $text = str_replace(chr(168),chr(208).chr(129),$text); # Ё
    $text = str_replace(chr(198),chr(208).chr(150),$text); # Ж
    $text = str_replace(chr(199),chr(208).chr(151),$text); # З
    $text = str_replace(chr(200),chr(208).chr(152),$text); # И
    $text = str_replace(chr(201),chr(208).chr(153),$text); # Й
    $text = str_replace(chr(202),chr(208).chr(154),$text); # К
    $text = str_replace(chr(203),chr(208).chr(155),$text); # Л
    $text = str_replace(chr(204),chr(208).chr(156),$text); # М
    $text = str_replace(chr(205),chr(208).chr(157),$text); # Н
    $text = str_replace(chr(206),chr(208).chr(158),$text); # О
    $text = str_replace(chr(207),chr(208).chr(159),$text); # П
    $text = str_replace(chr(209),chr(208).chr(161),$text); # С
    $text = str_replace(chr(210),chr(208).chr(162),$text); # Т
    $text = str_replace(chr(211),chr(208).chr(163),$text); # У
    $text = str_replace(chr(212),chr(208).chr(164),$text); # Ф
    $text = str_replace(chr(213),chr(208).chr(165),$text); # Х
    $text = str_replace(chr(214),chr(208).chr(166),$text); # Ц
    $text = str_replace(chr(215),chr(208).chr(167),$text); # Ч
    $text = str_replace(chr(216),chr(208).chr(168),$text); # Ш
    $text = str_replace(chr(217),chr(208).chr(169),$text); # Щ
    $text = str_replace(chr(218),chr(208).chr(170),$text); # Ъ
    $text = str_replace(chr(219),chr(208).chr(171),$text); # Ы
    $text = str_replace(chr(220),chr(208).chr(172),$text); # Ь
    $text = str_replace(chr(221),chr(208).chr(173),$text); # Э
    $text = str_replace(chr(222),chr(208).chr(174),$text); # Ю
    $text = str_replace(chr(223),chr(208).chr(175),$text); # Я
    $text = str_replace(chr(224),chr(208).chr(176),$text); # а
    $text = str_replace(chr(225),chr(208).chr(177),$text); # б
    $text = str_replace(chr(226),chr(208).chr(178),$text); # в
    $text = str_replace(chr(227),chr(208).chr(179),$text); # г
    $text = str_replace(chr(228),chr(208).chr(180),$text); # д
    $text = str_replace(chr(229),chr(208).chr(181),$text); # е
    $text = str_replace(chr(184),chr(209).chr(145),$text); # ё
    $text = str_replace(chr(230),chr(208).chr(182),$text); # ж
    $text = str_replace(chr(231),chr(208).chr(183),$text); # з
    $text = str_replace(chr(232),chr(208).chr(184),$text); # и
    $text = str_replace(chr(233),chr(208).chr(185),$text); # й
    $text = str_replace(chr(234),chr(208).chr(186),$text); # к
    $text = str_replace(chr(235),chr(208).chr(187),$text); # л
    $text = str_replace(chr(236),chr(208).chr(188),$text); # м
    $text = str_replace(chr(237),chr(208).chr(189),$text); # н
    $text = str_replace(chr(238),chr(208).chr(190),$text); # о
    $text = str_replace(chr(239),chr(208).chr(191),$text); # п
    $text = str_replace(chr(240),chr(209).chr(128),$text); # р
    $text = str_replace(chr(241),chr(209).chr(129),$text); # с
    $text = str_replace(chr(242),chr(209).chr(130),$text); # т
    $text = str_replace(chr(243),chr(209).chr(131),$text); # у
    $text = str_replace(chr(244),chr(209).chr(132),$text); # ф
    $text = str_replace(chr(245),chr(209).chr(133),$text); # х
    $text = str_replace(chr(246),chr(209).chr(134),$text); # ц
    $text = str_replace(chr(247),chr(209).chr(135),$text); # ч
    $text = str_replace(chr(248),chr(209).chr(136),$text); # ш
    $text = str_replace(chr(249),chr(209).chr(137),$text); # щ
    $text = str_replace(chr(250),chr(209).chr(138),$text); # ъ
    $text = str_replace(chr(251),chr(209).chr(139),$text); # ы
    $text = str_replace(chr(252),chr(209).chr(140),$text); # ь
    $text = str_replace(chr(253),chr(209).chr(141),$text); # э
    $text = str_replace(chr(254),chr(209).chr(142),$text); # ю
    $text = str_replace(chr(255),chr(209).chr(143),$text); # я

    return $text;
    }

(никто не узнает)
Код на картинке: