function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

function hexToStr($hex)
{
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2)
    {
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

function ucs2ToStr($hex)
{
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2)
    {
   if ( $hex[$i].$hex[$i+1] == "00" ) { 
    $i+=2;
   }
   $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

function hexbin($hex){
    $bin='';
    for($i=0;$i<strlen($hex);$i++)
        $bin.=str_pad(decbin(hexdec($hex{$i})),4,'0',STR_PAD_LEFT);
       return $bin;
} 

function binhex($bin){
    $hex='';
    for($i=strlen($bin)-4;$i>=0;$i-=4)
        $hex.=dechex(bindec(substr($bin,$i,4)));
   return strrev($hex);
}

function ucs2toutf8($str)
{
        for ($i=0;$i<strlen($str);$i+=4)
        {
                $substring1 = $str[$i].$str[$i+1];
                $substring2 = $str[$i+2].$str[$i+3];
 
                if ($substring1 == "00")
                {
                        $byte1 = "";
                        $byte2 = $substring2;
                }
                else
                {
                        $substring = $substring1.$substring2;
                        $byte1 = dechex(192+(hexdec($substring)/64));
                        $byte2 = dechex(128+(hexdec($substring)d));
                }
                $utf8 .= $byte1.$byte2;
        }
        return $utf8;
} 

 function ucs2html($str) {
    $str=trim($str); // if you are reading from file
    $len=strlen($str);
    $html='';
    for($i=0;$i<$len;$i+=2)
        $html.='&#'.hexdec(dechex(ord($str[$i+1])).
                   sprintf("s",dechex(ord($str[$i])))).';';
    return($html);
 }


function loadgsm7arrs()
{

  global $g2aarr, $a2garr;

  $g2aarr = array(
                  0x0040,
                  0x00A3,
                  0x0024,
                  0x00A5,
                  0x00E8,
                  0x00E9,
                  0x00F9,
                  0x00EC,
                  0x00F2,
                  0x00E7,
                  0x000A,
                  0x00D8,
                  0x00F8,
                  0x000D,
                  0x00C5,
                  0x00E5,
                  0x0394,
                  0x005F,
                  0x03A6,
                  0x0393,
                  0x039B,
                  0x03A9,
                  0x03A0,
                  0x03A8,
                  0x03A3,
                  0x0398,
                  0x039E,
                  0x00A0,
                  0x00C6,
                  0x00E6,
                  0x00DF,
                  0x00C9,
                  0x0020,
                  0x0021,
                  0x0022,
                  0x0023,
                  0x00A4,
                  0x0025,
                  0x0026,
                  0x0027,
                  0x0028,
                  0x0029,
                  0x002A,
                  0x002B,
                  0x002C,
                  0x002D,
                  0x002E,
                  0x002F,
                  0x0030,
                  0x0031,
                  0x0032,
                  0x0033,
                  0x0034,
                  0x0035,
                  0x0036,
                  0x0037,
                  0x0038,
                  0x0039,
                  0x003A,
                  0x003B,
                  0x003C,
                  0x003D,
                  0x003E,
                  0x003F,
                  0x00A1,
                  0x0041,
                  0x0042,
                  0x0043,
                  0x0044,
                  0x0045,
                  0x0046,
                  0x0047,
                  0x0048,
                  0x0049,
                  0x004A,
                  0x004B,
                  0x004C,
                  0x004D,
                  0x004E,
                  0x004F,
                  0x0050,
                  0x0051,
                  0x0052,
                  0x0053,
                  0x0054,
                  0x0055,
                  0x0056,
                  0x0057,
                  0x0058,
                  0x0059,
                  0x005A,
                  0x00C4,
                  0x00D6,
                  0x00D1,
                  0x00DC,
                  0x00A7,
                  0x00BF,
                  0x0061,
                  0x0062,
                  0x0063,
                  0x0064,
                  0x0065,
                  0x0066,
                  0x0067,
                  0x0068,
                  0x0069,
                  0x006A,
                  0x006B,
                  0x006C,
                  0x006D,
                  0x006E,
                  0x006F,
                  0x0070,
                  0x0071,
                  0x0072,
                  0x0073,
                  0x0074,
                  0x0075,
                  0x0076,
                  0x0077,
                  0x0078,
                  0x0079,
                  0x007A,
                  0x00E4,
                  0x00F6,
                  0x00F1,
                  0x00FC,
                  0x00E0 
                        );

  // create $a2garr
  // just flip the contents of keys and values
  foreach($g2aarr as $key => $val)
  {
    $a2garr[$val] = $key;
  }

  // then add the special chars we want to translate our way
  // in some cases they will be overwritten, for a reason
  $a2garr[13]   =  10;
  $a2garr[126]  =  32;
  $a2garr[94]   =  32;
  $a2garr[123]  =  40;
  $a2garr[125]  =  41;
  $a2garr[92]   =  47;
  $a2garr[91]   =  40;
  $a2garr[93]   =  41;
  $a2garr[124]  = 161;
  $a2garr[96]   =  39;
  $a2garr[8364] = 101;

}

//// ----------------------------------------
// asc2pdu()
//
// translates a string from regular alphabet to gsm-7
// encodes a string from septets to octets
// based upon 3GPP TS 23.038
// provides padding to match the septet boundary
//
// required parameters:
// - text
//   can be any length
// - padding bits
//   depending upon how long the header is from UDHL on,
//   we might need to add some padding bits as the pdu message
//   starts counting in septets from UDHL (inclusive),
//   but the whole UDH is in octets; padding is necessary
//   to start on the right septet boundary.
//   for further reference, check:
//   mobiletidings.com/2009/02/18/combining-sms-messages and
//   www.dreamfabric.com/sms
//
// needed globals:
// $a2garr[]
//
// returns {string}
// - translated/encoded string
//

function asc2pdu($txt, $pad)
{

  // global declare
  global $a2garr;

  // create a binary string starting with the
  // requested amount of padding bits (set to zero)
  $bstr = str_repeat('0', $pad);

  // sweep $txt for each character
  // append the 7 least significant bits to $bstr
  $txtlen = strlen($txt);
  for($tind = 0; $tind < $txtlen; $tind++)
  {

    // extract the char
    $xchr = substr($txt, $tind, 1);

    // read the ascii decimal chr
    $achr = ord($xchr);

    // translate it into gsm-7
    $tchr = $a2garr[$achr];

    // get the binary
    $bchr = base_convert($tchr, 10, 2);

    // pad it with zeroes
    $pchr = str_pad($bchr, 8, '0', STR_PAD_LEFT);

    // if it's in the high half of the byte
    // - log an error -- class 1
    // - change it into space
    //
    // further investigation incoming
    //
    if($pchr > 10000000)
    {
      // find your way to log the error
      // echoing is not the brightest way to do it :)
      echo "Found a char in the high byte half for text: ".$txt.
               " -- char is asc".$tchr."\r\n";
      $phcr = str_pad(base_convert('20', 16, 2), 8, '0', STR_PAD_LEFT);
    }

    // strip off the highest bit
    $schr = substr($pchr, 1);

    // reverse it and add to the resulting string
    $bstr .= strrev($schr);

  }

  // split into 8-bit chunks
  $carr = str_split($bstr, 8);

  // put together the hex string
  $hstr = '';
  foreach($carr as $chunk)
  {
    // reverse
    $rchk = strrev($chunk);

    // convert into hex
    $hchk = base_convert($rchk, 2, 16);

    // left pad with zeroes
    // add it to the hex string
    $hstr .= str_pad($hchk, 2, '0', STR_PAD_LEFT);
  }

  return $hstr;

}


//// ----------------------------------------
// pdu2asc()
//
// translates a string from gsm-7 to regular alphabet
// decodes a string from octets to septets
// based upon 3GPP TS 23.038
// provides psdding bits stripping
//
// required parameters:
// - text
// - padding bits to strip
//
// see header of asc2pdu()
//
// needed globals:
// $g2aarr[]
//
// returns {string}
// - translated/decoded string
//

function pdu2asc($pdu, $pad)
{

  // global declare
  global $g2aarr;

  // converting all octets in a big binary string
  $pdulen = strlen($pdu);

  $bstr = '';
  for($lind = 0; $lind < $pdulen; $lind += 2)
  {
    // extract the octet
    $xoct = substr($pdu, $lind, 2);

    // translate in binary
    $boct = base_convert($xoct, 16, 2);

    // pad it for the non significant zeroes
    $poct = str_pad($boct, 8, '0', STR_PAD_LEFT);

    // reverse it
    // add it to the binary string
    $bstr .= strrev($poct);
  }

  // strip off the padding bits
  // it has been previously added from the sender
  // to fit the next septet boundary
  // and we know exactly how many they are supposed to be
  $bstr = substr($bstr, $pad);

  // kill the extra bits off the last unfinished chunk, if any
  // or they would translate into nice @s
  $bmod = strlen($bstr) % 7;
  if($bmod)
  {
    $bstr = substr($bstr, 0, -$bmod);
  }

  // split it into 7-bit chunks
  $carr = str_split($bstr, 7);

  // put together the ascii string
  $astr = '';
  foreach($carr as $chunk)
  {
    // pad it with the non significant bits
    $pchk = str_pad(strrev($chunk), 8, '0', STR_PAD_LEFT);

    // translate it into ascii decimal
    $dchk = base_convert($pchk, 2, 10);

    // translate it into regular ascii alphabet
    $achk = $g2aarr[$dchk];

    // make it an ascii char and add it to the ascii string
    $astr .= chr($achk);
  }

  return $astr;

}

function utf16_to_utf8($str) {
    $c0 = ord($str[0]);
    $c1 = ord($str[1]);

    if ($c0 == 0xFE && $c1 == 0xFF) {
        $be = true;
    } else if ($c0 == 0xFF && $c1 == 0xFE) {
        $be = false;
    } else {
        return $str;
    }

    $str = substr($str, 2);
    $len = strlen($str);
    $dec = '';
    for ($i = 0; $i < $len; $i += 2) {
        $c = ($be) ? ord($str[$i]) << 8 | ord($str[$i + 1]) : 
                ord($str[$i + 1]) << 8 | ord($str[$i]);
        if ($c >= 0x0001 && $c <= 0x007F) {
            $dec .= chr($c);
        } else if ($c > 0x07FF) {
            $dec .= chr(0xE0 | (($c >> 12) & 0x0F));
            $dec .= chr(0x80 | (($c >>  6) & 0x3F));
            $dec .= chr(0x80 | (($c >>  0) & 0x3F));
        } else {
            $dec .= chr(0xC0 | (($c >>  6) & 0x1F));
            $dec .= chr(0x80 | (($c >>  0) & 0x3F));
        }
    }
    return $dec;
}

Add a code snippet to your website: www.paste.org