Java Hidden code

Sometime ago I came across the issue of invisible characters in Strings. These can really cause confusion because they are invisible.

    String a = "Hello\u200e";
    String b = "Hello\u200f";
    System.out.println('\'' + a + "' and '" + b + "' are length "
                     + a.length() + " and " + b.length() 
                     + ", equals() is " + a.equals(b));

prints

'Hello?' and 'Hello?' are length 6 and 6, equals() is false

Invisible identifiers

Imagine my reaction to discovering you can use invisible characters in identifiers in Java :P . These characters cannot appear at the start of identifiers in Java but can be anywhere else.

    System.out.println("String _\u200e = \"Hello \";");
    System.out.println("String _\u200f = \"World\";");
    System.out.println("String _\u200e\u200f = \" !!\";");
    System.out.println("System.out.println(_\u200e+_\u200f+_\u200e\u200f);");

prints

String _? = "Hello ";
String _? = "World";
String _?? = " !!";
System.out.println(_?+_?+_??);

which when run prints

Hello World !!

So we have three identifiers which all appear the same because they have different invisible characters in their names !!

Amazingly this code compiles, runs and prints all the characters which can be in an identifier but not start them. The code contains \u202e which really messes with the display of the code.

    for (char c??h = 0; c??h < Character.MAX_VALUE; c??h++)
        if (Character.isJavaIdentifierPart(c??h) && !Character.isJavaIdentifierStart(c??h))
            System.out.printf("%04x <%s>%n", (int) c??h, "" + c??h);

Reference: Hidden code from our JCG partner Peter Lawrey at the Vanilla Java blog.

Share and enjoy!
Post to Facebook Post to TwitterPost to Google+Post to Delicious Post to StumbleUponAdd to LinkedInAdd to DiggAdd to RedditSend via Mail


© 2010-2012 Java Code Geeks. Licenced under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
All trademarks and registered trademarks appearing on Java Code Geeks are the property of their respective owners.
Java is a trademark or registered trademark of Oracle Corporation in the United States and other countries.
Java Code Geeks is not connected to Oracle Corporation and is not sponsored by Oracle Corporation.