@Override
   public void parse() throws IllegalArgumentException
   {
      try
      {
         setEncoding(Encoding.getEncoding(buffer[0]));
      }
      catch (IllegalArgumentException ex)
      {  // ignore the bad value and set it to ISO-8859-1 so we can continue parsing the tag
         setEncoding(Encoding.ISO_8859_1);
      }
      try
      {
         setLanguage(Language.getLanguage(new String(buffer, 1, 3, Encoding.ISO_8859_1.getCharacterSet())));
      }
      catch (IllegalArgumentException ex)
      {  // ignore the bad value and set it to english so we can continue parsing the tag
         setLanguage(Language.ENG);
      }
      nullTerminatorIndex  = getNextNullTerminator(4, encoding.getCharacterSet());
      setDescription(new String(buffer, 4, nullTerminatorIndex-4, encoding.getCharacterSet()).trim());
      nullTerminatorIndex += encoding.getNumBytesInNullTerminator();
      setText((nullTerminatorIndex == buffer.length ? "" : new String(buffer, nullTerminatorIndex, buffer.length - nullTerminatorIndex, encoding.getCharacterSet()).trim()));
      dirty = false;    // we just read in the frame info, so the frame body's internal byte buffer is up to date
   }