Нужно поменять кодировку 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 am

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

  2. #2 by rott on 09.11.2009 - 9:59 am

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

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

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

  4. #4 by delphiec on 09.11.2009 - 10:00 am

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

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

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

  6. #7 by bitl on 09.11.2009 - 10:01 am

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

  7. #8 by макес on 09.11.2009 - 10:01 am

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

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

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

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

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

  10. #11 by Ща on 09.11.2009 - 10:02 am

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

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

  11. #12 by Дикс on 09.11.2009 - 10:03 am

    лол

  12. #13 by Иван on 09.11.2009 - 10:03 am

    из 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. #14 by M@ks on 09.11.2009 - 10:04 am

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

  14. #15 by Djoin on 09.11.2009 - 10:04 am

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

  15. #16 by xfile on 09.11.2009 - 10:05 am

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

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

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

  16. #17 by Aznavur on 09.11.2009 - 10:05 am

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

  17. #18 by novak on 09.11.2009 - 10:05 am

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

  18. #19 by lord80 on 09.02.2010 - 10:39 pm

    стандартная функция ConvertCharset.class.php
    прим. автора блога: раньше тут была ссылка, но она стала не рабочей, потому я ее удалил.

  19. #21 by sl4mmer on 28.06.2010 - 3:16 am

    плакаль

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

  20. #22 by Евгений on 07.09.2010 - 9:42 am

    Вот еще функция перекодировки из 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;
    }

  21. #25 by Dragon agr on 14.10.2010 - 4:30 pm

    Что-то не работает..:(

  22. #27 by alarm on 30.11.2010 - 5:31 pm

    Что-то у меня пропадают пробелы при кодировании из ютф8 в 1251, что при использовании iconv, что при использовании других функций. Причем исключительно когда парсится контент из рсс-ки своего твиттера, там есть какие-то подводные камни?

  23. #29 by Budulianin on 20.04.2011 - 11:26 am

    Уроки программирования от новичка новичкам – :D

    • #30 by proglammer on 20.04.2011 - 11:29 am

      смешно, да? :) мне тоже :) просто, часто, когда сам искал
      информацию о чем-либо в и-нете, попадали настолько заумные статьи,
      что нужно было ещё половину и-нета перерыть, что-бы понять о чем та
      статья, которую я первую начал читать… потому решил попробовать
      просто делиться опытом, мелкими шажками продвигаться, так
      сказать… а этот пост, кстати, не мой. он остался от прежнего
      владельца блога ;)

  24. #31 by Вася on 09.04.2012 - 4:18 pm

    Что за
    {=”"

    $new_c2=($c1&3)*64+($c&63);
    У меня это – куча ошибок подчёркивает

  25. #33 by Алекскс on 24.04.2012 - 2:25 pm

    Спасибо

  26. #34 by Инакентий on 12.02.2013 - 3:17 am

    В приведенном коде довольно много ошибок, но если их исправить то все таки работает. В некоторых местах не хватает названий переменных.
    Спасибо за код.

  27. #35 by Alecksey on 04.04.2014 - 10:12 pm

    вот этот код лучше, любую кодировку в UTF8
    iconv(mb_detect_encoding($text, mb_detect_order(), true), “UTF-8″, $text);

(никто не узнает)

Код на картинке: