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

    +163

    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
    29. 29
    30. 30
    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;
    }

    iconv не по мне..., я лучше с побитовыми операциями поработаю, зато сам!
    Гораздо медленее правда, зато своё!

    Запостил: dwinner, 22 Ноября 2010

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

    • Если уж битовые операции понеслись, то к чему *64, *256?
      Ответить
      • 256bit arch
        Ответить
        • Чо?

          я к тому, что

          $new_c2 = (($c1 & 3) << 6) | ($i & 63);
          $new_c1 = ($c1 >> 2) & 5;
          $new_i = ($new_c1 << 8) | $new_c2;

          Ну или
          $new_i = (($c1 & 23) << 6) | $i & 63
          вместо всего этого

          К чему использовать +, * в битовых операциях?
          Ответить
          • Ну не везде ж поразрядные использовать! Итак медленно работает, пусть работает ещё медленнее ))) Зачем было оптимизировать этот код, когда уже потом я узнал про iconv??? Только если ради мозгоПИПства... А изначально было как запостил, вот.
            Ответить
            • Ок. Хотя у меня чаще бывает наоборот.

              Какая-то функция нужна, сначала полчаса ищу по интернетам где же она уже реализована, потом ещё столько же подключаю к проекту библиотеку (в которой помимо этой функции ещё куча всего), хотя функцию можно было написать самому за пару минут=)

              Например apache-commons ради StringUtils.join.
              Ответить
      • Ах да, совсем забыл про более ясные двоичные числа!
        Между прочим, специально забыл!
        Ответить
      • между прочим 2 в 6 = 64, а 2 в 8 = 256
        Ответить
    • Почти что таки вершина идиотизма работать с битами через интерпрететор, тем более с php.
      Ответить
      • Возникает иногда необходимость, но явно не в этом случае.
        Ответить
        • ага, если объём обрабатываемых данных не превышает одного байта :)
          Ответить
          • Был у меня один пример из жизни... Должно быть знакомо тем, кто сталкивался с асинхронными запросами на получение компонентов цвета из какой-нибудь палитры при щелчке на ней...
            <?php
            # bla bla bla...
            $imgfile = URL_PATH.'palette.png';
            $img = imagecreatefrompng($imgfile);
            $offsetx = is_numeric($_GET['offsetx']) ? intval($_GET['offsetx']) : 0;
            $offsety = is_numeric($_GET['offsety']) ? intval($_GET['offsety']) : 0;
            $rgb = imagecolorat($img, $offsetx, $offsety);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8) & 0xFF;
            $b = $rgb & 0xFF;
            printf('#%02s%02s%02s', dechex($r), dechex($g), dechex($b));
            ?>
            Ответить
            • такие штуки сейчас и средствами javascript неплохо выполняются...
              Ответить
              • Я ожидал такого ответа! Полностью согласен, но в том ресурсе пришлось делать так, причин много было...
                Ответить
      • а что вы скажете о необходимости работать с битами из мускула Select * from table where (field & 32) >1 -- все где Выствлен 5 бит

        :) да всяким сишникам лень разбирать байт по полям вот сам с усам :)
        Ответить
        • можно и просто "where (field & 32)"
          --
          я про интерпретаторы говорю.. работа с битами в циклах.
          Однажды встретил кусок php кода, обрабатывающий изображение формата bmp по строчкам, по пикселям... Вот это было действительно монструально. Кажется автор заявлял, что с картинкой 1024х768 скрипт работал около двух минут...
          Ответить
    • показать все, что скрытоНеправильно функцию назвали, надо было так:
      UTF-8 - вин!
      ---
      А что, интерпретатор PHP уныло обрабатывает операции с битами? Я думал, что в итоге получается машинный код, в котором все делается быстро :(
      Ответить
      • интерпретатор
        Ответить
        • тут на одну строку операцию интерпретатор будет делать двадцать своих операций

          Поэтому ты хоть биты гоняй, хоть double умножай, хоть строки конкатенируй, всё равно будет долго=)
          Ответить
      • работа с битами займет например 0.05% времени выполнения скрипта, и явно не станет боттл-неком
        Ответить

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