Hidden Code
Join the DZone community and get the full member experience.
Join For FreeSometime 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 ch = 0; ch < Character.MAX_VALUE; ch++) if (Character.isJavaIdentifierPart(ch) && !Character.isJavaIdentifierStart(ch)) System.out.printf("%04x <%s>%n", (int) ch, "" + ch);
Published at DZone with permission of Peter Lawrey, DZone MVB. See the original article here.
Opinions expressed by DZone contributors are their own.
Trending
-
Getting Started With the YugabyteDB Managed REST API
-
SRE vs. DevOps
-
5 Key Concepts for MQTT Broker in Sparkplug Specification
-
A Complete Guide to AWS File Handling and How It Is Revolutionizing Cloud Storage
Comments