title: NSCharacterSet URLHostAllowedCharacterSet doesn't replace '+' sign?
body: <p>I'm struggling to transmit long encrypted strings over the network and get them to come out correctly on the server. For example, I have this encrypted string on the client:</p>
  
  <blockquote>
    <p>wcWSERZCh8Xm1hpbNo1kSD1LvFmpuUr4wmq9hQUWeK0vYcLeFPGwFR/sBTES1A4rPV6eyp9nzEEU9uKkiFSTdP+SPOSqUf6evjf3WRHrXMRe81lIrHuRyk0iRwoNe5uIk+VlpR41kETmznXa4+gELmf53r7oayRkkffnIPDmpO+WbgE0VL3PQeOsXB01tWJyDiBIsz5WJiiEIm3ZoJW/sw==</p>
  </blockquote>
  
  <p>As you can see, it has a few characters that will not transmit over the network without some URL encoding (<code>+</code> and <code>/</code>, most notably). I'm not entirely sure if there could be other characters that could arise in other situations, so I want to make sure that my solution is 'universally' correct. I am using this line:</p>
  
  <pre><code>NSString *escapedString = [cipherString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
  </code></pre>
  
  <p>which I found in a highly reviewed <a href="https://stackoverflow.com/questions/8086584/objective-c-url-encoding">answer</a>.</p>
  
  <p>However, I'm still having trouble decrypting this on the server side, so I printed out the results on the client immediately before sending, and I see this:</p>
  
  <blockquote>
    <p>wcWSERZCh8Xm1hpbNo1kSD1LvFmpuUr4wmq9hQUWeK0vYcLeFPGwFR%2FsBTES1A4rPV6eyp9nzEEU9uKkiFSTdP+SPOSqUf6evjf3WRHrXMRe81lIrHuRyk0iRwoNe5uIk+VlpR41kETmznXa4+gELmf53r7oayRkkffnIPDmpO+WbgE0VL3PQeOsXB01tWJyDiBIsz5WJiiEIm3ZoJW%2Fsw==</p>
  </blockquote>
  
  <p>Why are the '+' signs still there? Am I using the wrong allowed character set? Which character set should I use to guarantee that I correctly escape all problematic characters?</p>
  
  <p>If it helps, here is the code that I am using to encrypt the plain text string. When it is done, I base64 encode the results before sending across the network:</p>
  
  <pre><code>- (NSData *)phpEncryptCleartext : (NSData *)cleartext
  {
      NSData *cleartextPadded = [self phpPadData:cleartext];
  
      CCCryptorStatus ccStatus        = kCCSuccess;
      size_t          cryptBytes      = 0;    // Number of bytes moved to buffer.
      NSMutableData  *cipherTextData  = [NSMutableData dataWithLength:cleartextPadded.length];
  
      ccStatus = CCCrypt(kCCEncrypt,
                         kCCAlgorithmAES128,
                         0,
                         _sessionKey.bytes,
                         kCCKeySizeAES128,
                         _iv.bytes,
                         cleartextPadded.bytes,
                         cleartextPadded.length,
                         cipherTextData.mutableBytes,
                         cipherTextData.length,
                         &amp;cryptBytes);
  
      if (ccStatus == kCCSuccess) {
          cipherTextData.length = cryptBytes;
      }
      else {
          NSLog(@"kEncryptionError code: %d", ccStatus); // Add error handling
          cipherTextData = nil;
      }
  
      return cipherTextData;
  }
  </code></pre>
  
  <p>Thanks for any advice!</p>