code: private static boolean isLetter2 (char c)
      {
  	// [84] Letter ::= BaseChar | Ideographic
  	// [85] BaseChar ::= ... too much to repeat
  	// [86] Ideographic ::= ... too much to repeat
  	// [87] CombiningChar ::= ... too much to repeat
  
  	//
  	// Optimize the typical case.
  	//
  	if (c >= 'a' && c <= 'z')
  	    return true;
  	if (c == '>')
  	    return false;
  	if (c >= 'A' && c <= 'Z')
  	    return true;
  
  	//
  	// Since the tables are too ridiculous to use in code,
  	// we're using the footnotes here to drive this test.
  	//
  	switch (Character.getType (c)) {
  	    // app. B footnote says these are 'name start'
  	    // chars' ...
  	  case Character.LOWERCASE_LETTER:		// Ll
  	  case Character.UPPERCASE_LETTER:		// Lu
  	  case Character.OTHER_LETTER:			// Lo
  	  case Character.TITLECASE_LETTER:		// Lt
  	  case Character.LETTER_NUMBER:			// Nl
  	    // ... and these are name characters 'other
  	    // than name start characters'
  	  case Character.COMBINING_SPACING_MARK:	// Mc
  	  case Character.ENCLOSING_MARK:		// Me
  	  case Character.NON_SPACING_MARK:		// Mn
  	  case Character.MODIFIER_LETTER:		// Lm
  	  case Character.DECIMAL_DIGIT_NUMBER:		// Nd
  
  	    // OK, here we just have some exceptions to check...
  	    return !isCompatibilityChar (c)
  		    // per "5.14 of Unicode", rule out some combiners
  		&& !(c >= 0x20dd && c <= 0x20e0);
  
  	  default:
  		// added a character ...
  	    return c == 0x0387;
  	}
      }
docs: guts of isNameChar/isNCNameChar