Advertisement
sebbu

js-deflate issue #15 fix in PHP

Aug 7th, 2019
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 1.48 KB | None | 0 0
  1. <?php
  2. function cp_to_utf8($text) {
  3.     $out='';
  4.     $size=strlen($text);
  5.     $pos=0;
  6.     $count=0;
  7.     $nb=0;
  8.     $nb2=0;
  9.     $nb3=0;
  10.     $nb4=0;
  11.     $c='';
  12.     while($pos<$size) {
  13.         $nb=ord($text[$pos]);
  14.         if($nb<=0x7F) {
  15.             //UTF8 1byte
  16.             $out.=chr($nb);
  17.             ++$pos;
  18.         }
  19.         else if(($nb & 0xE0) == 0xC0) {
  20.             // 110x xxxx
  21.             $nb2=ord($text[$pos+1]);
  22.             assert( ($nb2&0xBF)==$nb2 ) or die('error2');
  23.             $c=( ($nb & 0x1F) << 6 ) | ($nb2 & 0x3F);
  24.             assert( $c<256 || ( (($c>>8)==0xFF) & ($c&0xFFFF00FF<256) ) );
  25.             $out.=chr($c);
  26.             $pos+=2;
  27.         }
  28.         else if(($nb & 0xF0) == 0xE0) {
  29.             // 1110 xxxx
  30.             $nb2=ord($text[$pos+1]);
  31.             $nb3=ord($text[$pos+2]);
  32.             assert( ($nb2&0xBF)==$nb2 ) or die('error3a');
  33.             assert( ($nb3&0xBF)==$nb3 ) or die('error3b');
  34.             $c=( ($nb & 0x1F) << 12 ) | ( ($nb2 & 0x3F) << 6 ) | ($nb3 & 0x3F);
  35.             assert( ($c<256) || ( (($c>>8)==0xFF) && (($c&0xFFFF00FF)<256) ) ) or die(var_dump($c, true));
  36.             $out.=chr($c);
  37.             $pos+=3;
  38.         }
  39.         else if(($nb & 0xF8) == 0xF0) {
  40.             // 1111 0xxx
  41.             $nb2=ord($text[$pos+1]);
  42.             $nb3=ord($text[$pos+2]);
  43.             $nb4=ord($text[$pos+3]);
  44.             assert( ($nb2&0xBF)==$nb2 ) or die('error4a');
  45.             assert( ($nb3&0xBF)==$nb3 ) or die('error4b');
  46.             assert( ($nb4&0xBF)==$nb4 ) or die('error4c');
  47.             $c=( ($nb & 0x1F) << 18 ) | ( ($nb2 & 0x3F) << 12 ) | ( ($nb3 & 0x3F) << 6 ) | ($nb4 & 0x3F);
  48.             assert( ($c<256) || ( (($c>>8)==0xFF) && (($c&0xFFFF00FF)<256) ) ) or die(var_dump($c, true));
  49.             $out.=chr($c);
  50.             $pos+=3;
  51.         }
  52.     }
  53.     return $out;
  54. }
  55. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement