1. PHP / Говнокод #12359

    +56

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    function utf8_to_cp1251 ($txt)  {
      $out_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)
      );
      $in_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;
    }

    Ещё один случай лютой ненависти к iconv().

    Запостил: Stallman, 26 Декабря 2012

    Комментарии (12) RSS

    • Как кто-то замечательно выразился, "utf_to_wtf"
      Ответить
    • Просто мимо проходил. В PHP есть возможность записать код символа как-то попроще, без вызова chr 100500 раз?
      Ответить
      • просто вставить в строку сам символ? например "абвгд". естественно что файл должен быть сохранен в utf-8 - и кодировка вывода тоже должна быть utf-8.

        если я правильно помню, то пыху на данные в строке посрать.

        крутые хацкеры извращаются потому что utf-8 "медленее" и/или cp1251 есть одна и единственная тру кодировка.
        Ответить
        • Написать "абвгд" — это понятно, но таким образом мы будем зависеть от кодировки страницы. А можно как-то переписать функцию из примера выше так, чтобы не вызывать chr, но при этом сохранить всё остальное? В Си можно записать символ числом, например, если очень надо. Тут так нельзя?
          Ответить
          • > В Си можно записать символ числом, например, если очень надо.

            Нет, нельзя.

            > Тут так нельзя?

            Нет такой абстрактной концепции как код символа. Код символа существует только как часть кодировки. Поэтому то собственно говоря "кодовая страница" и называется "кодовой" - потому что она определяет какое число/код обозначает какой символ.

            > но таким образом мы будем зависеть от кодировки страницы.

            Запись символов кодами или простой строкой ВСЕГДА зависит от кодировки. Поэтому например клиент/бровзер тоже должен знать в какой кодировке ему приходят данные что бы их корректно отобразить как символы.

            Простое правило: стандартизируешь проект на одной кодировке и только ей исключительно и пользуешься, включая базу.
            Ответить
            • Я тут мощно подумал и понял, что так оно всё и есть. Благодарю.
              Ответить
              • нет проблем. мой моск время от времени тоже впадает в рекурсию проблемы представления одной кодировки в другой. в особенности после длительных сессий восстанавливания данных поврежденных двойной/тройной перекодировкой.
                Ответить
                • http://tinyurl.com/c4a342w (не знаю насколько это поможет при множественном преобразовании)
                  Ещё есть http://www.artlebedev.ru/tools/decoder/ (вот он может в множественное)
                  Ответить
                  • это не такая большая проблема (хотя все равно надо забукмаркить - спасибо).

                    проблема это когда *часть* символов могут/не могут быть представлены в промежуточной кодировке. 90% процентов текста выглядит ОК - 10% кракозябы (или наоборот). русских кодировок /ограниченое/ количество - в отличии на пример от кодировок (и их версий!) для южнослявянских языков которые пользуются латинским алфавитом.
                    Ответить
    • iconv на каких-нибудь древних серваках может не стоять.

      Но, ИМХО, реализовать можно было проще с помощью utf8_decode и convert_cyr_string.
      Ответить

    Добавить комментарий