Over a million developers have joined DZone.

Hidden Code

· Java Zone

Discover how AppDynamics steps in to upgrade your performance game and prevent your enterprise from these top 10 Java performance problems, brought to you in partnership with AppDynamics.

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);

The Java Zone is brought to you in partnership with AppDynamics. AppDynamics helps you gain the fundamentals behind application performance, and implement best practices so you can proactively analyze and act on performance problems as they arise, and more specifically with your Java applications. Start a Free Trial.

Topics:

Published at DZone with permission of Peter Lawrey , DZone MVB .

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}