code: static void encode(Encoder encoder, Writer out, String str)
          throws IOException
      {
          if (str == null) {
              // consistent with String.valueOf(...) use "null" for null.
              str = "null";
          }
  
          // quick pass--see if we need to actually encode anything, if not
          // return the value unchanged.
          final int n = str.length();
          int j = encoder.firstEncodedOffset(str, 0, n);
  
          if (j == n) {
              out.write(str);
              return;
          }
  
          // otherwise, we need to encode.  We use a buffer to avoid
          // excessive memory allocation for these calls.  Note: this means that
          // an encoder implementation must NEVER call this method internally.
          new Buffer().encode(encoder, out, str, j);
      }
docs: Core encoding loop shared by public methods.  It first uses the
  encoder to scan the input for characters that need encoding.  If no
  characters require encoding, the input string is written directly to
  the writer.  Otherwise a buffer is used to encode the
  remainder of the input to the buffers.  This version saves a wrapping
  in an String.
  
  @param encoder the encoder to use
  @param out the writer for the encoded output
  @param str the string to encode
  @throws IOException if thrown by the writer