docs: protected String findCHName( char[] chars, int index, IChunk chunk ) 
      {
          StringBuilder isb = new StringBuilder();
          //isb.clear();
          /*there is only two IWords in the chunk. */
          if ( chunk.getWords().length == 2 ) {
              IWord w = chunk.getWords()[1];
              switch ( w.getLength() ) {
              case 1:
                  if ( dic.match(ILexicon.CN_SNAME, w.getValue()) ) {
                      isb.append(w.getValue());
                      return isb.toString();
                  }
                  return null;
              case 2:
              case 3:
                  /*
                   * there is only two IWords in the chunk.
                   * case 2:
                   * like: 这本书是陈高的, chunk: 陈_高的
                   * more: 瓜子和坚果,chunk: 和_坚果 (1.6.8前版本有歧义)
                   * case 3:
                   * 1.double name: the two chars and char after it make up a word.
                   * like: 这本书是陈美丽的, chunk: 陈_美丽的
                   * 2.single name: the char and the two chars after it make up a word. -ignore
                   */
                  String d1 = new String(w.getValue().charAt(0)+"");
                  String d2 = new String(w.getValue().charAt(1)+"");
                  if ( dic.match(ILexicon.CN_DNAME_1, d1)
                          && dic.match(ILexicon.CN_DNAME_2, d2)) {
                      isb.append(d1);
                      isb.append(d2);
                      return isb.toString();
                  } 
                  /*
                   * the name char of the single name and the char after it
                   *         make up a word. 
                   */
                  else if ( dic.match(ILexicon.CN_SNAME, d1) ) {
                      IWord iw = dic.get(ILexicon.CJK_WORD, d2);
                      if ( iw != null && iw.getFrequency() >= config.NAME_SINGLE_THRESHOLD ) {
                          isb.append(d1);
                          return isb.toString();
                      }
                  }
                  
                  return null;
              }
          } else {
              /*three IWords in the chunk */
              IWord w1 = chunk.getWords()[1];
              IWord w2 = chunk.getWords()[2];
              switch ( w1.getLength() ) {
              case 1:
                  /*check if it is a double name first.*/
                  if ( dic.match(ILexicon.CN_DNAME_1, w1.getValue()) ) {
                      if ( w2.getLength() == 1 ) {
                          /*real double name?*/
                          if ( dic.match(ILexicon.CN_DNAME_2, w2.getValue()) ) {
                              isb.append(w1.getValue());
                              isb.append(w2.getValue());
                              return isb.toString();
                          }
                          /*not a real double name, check if it is a single name.*/
                          else if ( dic.match(ILexicon.CN_SNAME, w1.getValue()) ) {
                              isb.append(w1.getValue());
                              return isb.toString();
                          }
                      } 
                      /*
                       * double name:
                       * char 2 and the char after it make up a word.
                       * like: 陈志高兴奋极了, chunk:陈_志_高兴 (兴和后面成词)
                       * like: 陈志高的, chunk:陈_志_高的 ("的"的阕值Config.SINGLE_THRESHOLD)
                       * like: 陈高兴奋极了, chunk:陈_高_兴奋 (single name)
                       */
                      else {
                          String d1 = new String(w2.getValue().charAt(0)+"");
                          int index_ = index + chunk.getWords()[0].getLength() + 2;
                          IWord[] ws = getNextMatch(chars, index_);
                          //System.out.println("index:"+index+":"+chars[index]+", "+ws[0]);
                          /*is it a double name?*/
                          if ( dic.match(ILexicon.CN_DNAME_2, d1) && 
                                  (ws.length > 1 || ws[0].getFrequency() >= config.NAME_SINGLE_THRESHOLD)) {
                              isb.append(w1.getValue());
                              isb.append(d1);
                              return isb.toString();
                          }
                          /*check if it is a single name*/
                          else if ( dic.match(ILexicon.CN_SNAME, w1.getValue()) ) {
                              isb.append(w1.getValue());
                              return isb.toString();
                          }
                      }
                  } 
                  /*check if it is a single name.*/
                  else if ( dic.match(ILexicon.CN_SNAME, w1.getValue()) ) {
                      isb.append(w1.getValue());
                      return isb.toString();
                  }
                  
                  return null;
              case 2:
                  String d1 = new String(w1.getValue().charAt(0)+"");
                  String d2 = new String(w1.getValue().charAt(1)+"");
                  /*
                   * it is a double name and char 1, char 2 make up a word.
                   * like: 陈美丽是对的, chunk: 陈_美丽_是
                   * more: 都成为高速公路, chunk:都_成为_高速公路 (1.6.8以前的有歧义)
                   */
                  if ( dic.match(ILexicon.CN_DNAME_1, d1)
                          && dic.match(ILexicon.CN_DNAME_2, d2)) {
                      isb.append(w1.getValue());
                      return isb.toString();
                  }
                  /*
                   * it is a single name, char 1 and the char after it make up a word.
                   */
                  else if ( dic.match(ILexicon.CN_SNAME, d1) ) {
                      IWord iw = dic.get(ILexicon.CJK_WORD, d2);
                      if ( iw != null && iw.getFrequency() >= config.NAME_SINGLE_THRESHOLD ) {
                          isb.append(d1);
                          return isb.toString();
                      }
                  }
                  
                  return null;
              case 3:
                  /*
                   * single name:  - ignore
                   *  mean the char and the two chars after it make up a word.
                   *  
                   * it is a double name.
                   * like: 陈美丽的人生， chunk: 陈_美丽的_人生
                   */
                  String c1 = new String(w1.getValue().charAt(0)+"");
                  String c2 = new String(w1.getValue().charAt(1)+"");
                  IWord w3 = dic.get(ILexicon.CJK_WORD, w1.getValue().charAt(2)+"");
                  if ( dic.match(ILexicon.CN_DNAME_1, c1)
                          && dic.match(ILexicon.CN_DNAME_2, c2)
                          && (w3 == null || w3.getFrequency() >= config.NAME_SINGLE_THRESHOLD)) {
                      isb.append(c1);
                      isb.append(c2);
                      return isb.toString();
                  }
                  
                  return null;
              }
          }
          
          return null;
      }