Illegal, 0x40 => CR/LF) // $_FromUTF7 = array ( 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 00 - 07 - Ctrl - 0x80, 0x80, 0x40, 0x80, 0x80, 0x40, 0x80, 0x80, // 08 - 0F - Ctrl - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 10 - 17 - Ctrl - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 18 - 1F - Ctrl - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, // 20 - 27 !"#$%&' 0x80, 0x80, 0x80, 0x3E, 0x3F, 0x80, 0x80, 0x3F, // 28 - 2F ()*+,-./ 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, // 30 - 37 01234567 0x3C, 0x3D, 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, // 38 - 3F 89:;<=>? 0x80, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // 40 - 47 @ABCDEFG 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, // 48 - 4F HIJKLMNO 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, // 50 - 57 PQRSTUVW 0x17, 0x18, 0x19, 0x80, 0x80, 0x80, 0x80, 0x80, // 58 - 5F XYZ[\]^_ 0x80, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, // 60 - 67 `abcdefg 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, // 68 - 6F hijklmno 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, // 70 - 77 pqrstuvw 0x31, 0x32, 0x33, 0x80, 0x80, 0x80, 0x80, 0x80, // 78 - 7F xyz{|}~ ); // // // UTF7EncodeInit: // // Start the encoding of bytes // function UTF7EncodeInit(&$Context) { $Context[ "Data" ] = ""; $Context[ "Count" ] = 0; $Context[ "Pos" ] = 0; $Context[ "State" ] = 0; } // UTF7EncodeInit // // // UTF7EncodeByte: // // Encodes one byte to UTF7 // function UTF7EncodeByte(&$Context, $Byte) { global $_ToUTF7; $Byte = ord($Byte); switch ($Context[ "State" ]) { case 0: // Convert into a byte $Context[ "Data" ] = $_ToUTF7[ $Byte >> 2 ]; $Context[ "Pos" ]++; // Save residue for next converted byte $Context[ "Residue" ] = ($Byte & 0x03) << 4; // This is the first byte in this line $Context[ "Count" ] = 1; // Next state is 1 $Context[ "State" ] = 1; break; case 1: // Convert into a byte $Context[ "Data" ] .= $_ToUTF7[ $Context[ "Residue" ] | ($Byte >> 4) ]; $Context[ "Pos" ]++; // Save residue for next converted byte $Context[ "Residue" ] = ($Byte & 0x0F) << 2; // Bumb byte counter $Context[ "Count" ]++; // Next state is 2 $Context[ "State" ] = 2; break; case 2: // Convert into a byte $Context[ "Data" ] .= $_ToUTF7[ $Context[ "Residue" ] | ($Byte >> 6) ]; $Context[ "Pos" ]++; // Residue fits precisely into the next byte $Context[ "Data" ] .= $_ToUTF7[ $Byte & 0x3F ]; $Context[ "Pos" ]++; // Bumb byte counter $Context[ "Count" ]++; // Next state is 3 $Context[ "State" ] = 3; break; case 3: // Convert into a byte $Context[ "Data" ] .= $_ToUTF7[ $Byte >> 2 ]; $Context[ "Pos" ]++; // Save residue for next converted byte $Context[ "Residue" ] = ($Byte & 0x03) << 4; // Bumb byte counter $Context[ "Count" ]++; // Next state is 1 $Context[ "State" ] = 1; break; default: // printf("Internal error in UTF7Encode: State is %d\n", $Context[ "State" ]); // exit(1); break; } } // UTF7EncodeByte // // // UTF7EncodeFinal: // // Terminates the encoding of bytes // function UTF7EncodeFinal(&$Context) { if ($Context[ "State" ] == 0) return ""; if ($Context[ "State" ] != 3) UTF7EncodeByte($Context, "\0"); return $Context[ "Data" ]; } // UTF7EncodeFinal // // // UTF7EncodeString // // Encodes a string to modified UTF-7 format // function UTF7EncodeString($String) { // Not during encoding, yet $Encoding = false; // Go through the string for ($I = 0; $I < strlen($String); $I++) { $Ch = substr($String, $I, 1); if (ord($Ch) > 0x7F) { if (! $Encoding) { $RetVal .= "&"; $Encoding = true; // Initialise UTF7 context UTF7EncodeInit($Context); } UTF7EncodeByte($Context, "\0"); UTF7EncodeByte($Context, $Ch); } elseif ($Ch == "&") { if (! $Encoding) { $RetVal .= "&"; $Encoding = true; // Initialise UTF7 context UTF7EncodeInit($Context); } else { UTF7EncodeByte($Context, "\0"); UTF7EncodeByte($Context, $Ch); } } else { if ($Encoding) { $RetVal .= UTF7EncodeFinal($Context) . "-$Ch"; $Encoding = false; } else $RetVal .= $Ch; } } if ($Encoding) $RetVal .= UTF7EncodeFinal($Context) . "-"; return $RetVal; } // UTF7EncodeString // // // UTF7DecodeInit: // // Start the decoding of bytes // function UTF7DecodeInit(&$Context) { $Context[ "Data" ] = ""; $Context[ "State" ] = 0; $Context[ "Pos" ] = 0; } // UTF7DecodeInit // // // UTF7DecodeByte: // // Decodes one character from UTF7 // function UTF7DecodeByte(&$Context, $Byte) { global $BASE64DECODE_INVALID_DATA; global $_FromUTF7; // Restore bits $Byte = $_FromUTF7[ ord($Byte) ]; // Ignore carriage returns and linefeeds if ($Byte == 0x40) return ""; // Invalid byte - Tell caller! if ($Byte == 0x80) $Context[ "Count" ] = $BASE64DECODE_INVALID_DATA; switch ($Context[ "State" ]) { case 0: // Save residue $Context[ "Residue" ] = $Byte; // Initialise count $Context[ "Count" ] = 0; // Next state $Context[ "State" ] = 1; break; case 1: // Store byte $Context[ "Data" ] .= chr(($Context[ "Residue" ] << 2) | ($Byte >> 4)); $Context[ "Pos" ]++; // Update count $Context[ "Count" ]++; // Save residue $Context[ "Residue" ] = $Byte; // Next state $Context[ "State" ] = 2; break; case 2: // Store byte $Context[ "Data" ] .= chr(($Context[ "Residue" ] << 4) | ($Byte >> 2)); $Context[ "Pos" ]++; // Update count $Context[ "Count" ]++; // Save residue $Context[ "Residue" ] = $Byte; // Next state $Context[ "State" ] = 3; break; case 3: // Store byte $Context[ "Data" ] .= chr(($Context[ "Residue" ] << 6) | $Byte); $Context[ "Pos" ]++; // Update count $Context[ "Count" ]++; // Next state $Context[ "State" ] = 4; break; case 4: // Save residue $Context[ "Residue" ] = $Byte; // Next state $Context[ "State" ] = 1; break; } } // UTF7DecodeByte // // // UTF7DecodeFinal: // // Decodes one character from UTF7 // function UTF7DecodeFinal(&$Context) { // Buffer not empty - Return remainder! if ($Context[ "Count" ]) { $Context[ "Pos" ] = 0; $Context[ "State" ] = 0; return $Context[ "Data" ]; } return ""; } // UTF7DecodeFinal // // // UTF7DecodeString // // Converts a string encoded in modified UTF-7 encoding // to ISO 8859-1. // OBS: Works only for valid ISO 8859-1 characters in the // encoded data // function UTF7DecodeString($String) { $Decoding = false; for ($I = 0; $I < strlen($String); $I++) { $Ch = substr($String, $I, 1); if ($Decoding) { if ($Ch == "-") { $RetVal .= UTF7DecodeFinal($Context); $Decoding = false; } else UTF7DecodeByte($Context, $Ch); } elseif ($Ch == "&") { if (($I < strlen($String) - 1) && (substr($String, $I + 1, 1) == "-")) { $RetVal .= $Ch; $I++; } else { UTF7DecodeInit($Context); $Decoding = true; } } else $RetVal .= $Ch; } return str_replace("\0", "", $RetVal); } // UTF7DecodeString ?>