Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4141676

Character isJavaLetter and isJavaLetterOrDigit methods don't comply with specs

XMLWordPrintable

    • beta
    • sparc
    • solaris_2.5
    • Verified



      Name: saC57035 Date: 05/26/98



      Let's consider for example the isJavaLetter method (the problem in the
      isJavaLetterOrDigit method is exactly the same).

      The specification for isJavaLetter says:

      "A character is considered to be a Java letter if and only if it
       is a letter, the ASCII dollar sign character <code>'$'</code>, or
       the underscore character <code>'_'</code>."

      However, the implementation considers other currency symbols and
      connecting punctuation characters as Java letters either. In fact,
      as seen from the source code, it behaves exactly as the
      isJavaIdentifierStart method, whilst their specs are pretty different.

      Here is the example demonstrating the bug:
      ------------------------------------------
      public class CharTest {

        public static void main(String args[]) {
          char falseChars[] = {
            '\u00A2', '\u00A3', '\u00A4', '\u00A5', '\u09F2',
            '\u09F3', '\u0E3F', '\u20A0', '\u20A1', '\u20A2', '\u20A3',
            '\u20A4', '\u20A5', '\u20A6', '\u20A7', '\u20A8', '\u20A9',
            '\u20AA', '\u20AB', '\uFE69', '\uFF04', '\uFFE0',
            '\uFFE1', '\uFFE5', '\uFFE6',
            '\u203F', '\u2040', '\uFE33', '\uFE34', '\uFE4D',
            '\uFE4E', '\uFE4F', '\uFF3F'
          };
          int failures=0;
          for (int i=0;i<falseChars.length;i++) {
            if ( Character.isJavaLetter(falseChars[i]) ) {
              System.out.println ("isJavaLetter(\\u"+
                Integer.toHexString(falseChars[i]).toUpperCase()+"): false expected.");
              ++failures;
            }
          }
          if (failures == 0)
            System.out.println("Test passed");
        }

      }
      ---- Output -------------------
      isJavaLetter(\uA2): false expected.
      isJavaLetter(\uA3): false expected.
      isJavaLetter(\uA4): false expected.
      isJavaLetter(\uA5): false expected.
      isJavaLetter(\u9F2): false expected.
      isJavaLetter(\u9F3): false expected.
      isJavaLetter(\uE3F): false expected.
      isJavaLetter(\u20A0): false expected.
      isJavaLetter(\u20A1): false expected.
      isJavaLetter(\u20A2): false expected.
      isJavaLetter(\u20A3): false expected.
      isJavaLetter(\u20A4): false expected.
      isJavaLetter(\u20A5): false expected.
      isJavaLetter(\u20A6): false expected.
      isJavaLetter(\u20A7): false expected.
      isJavaLetter(\u20A8): false expected.
      isJavaLetter(\u20A9): false expected.
      isJavaLetter(\u20AA): false expected.
      isJavaLetter(\u20AB): false expected.
      isJavaLetter(\uFE69): false expected.
      isJavaLetter(\uFF04): false expected.
      isJavaLetter(\uFFE0): false expected.
      isJavaLetter(\uFFE1): false expected.
      isJavaLetter(\uFFE5): false expected.
      isJavaLetter(\uFFE6): false expected.
      isJavaLetter(\u203F): false expected.
      isJavaLetter(\u2040): false expected.
      isJavaLetter(\uFE33): false expected.
      isJavaLetter(\uFE34): false expected.
      isJavaLetter(\uFE4D): false expected.
      isJavaLetter(\uFE4E): false expected.
      isJavaLetter(\uFE4F): false expected.
      isJavaLetter(\uFF3F): false expected.
      ---------------------------------------------

            joconnersunw John Oconner (Inactive)
            savzan Stanislav Avzan (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: