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));
'Hello?' and 'Hello?' are length 6 and 6, equals() is false
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);");
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);
Bulletproof Java Code: A Practical Strategy for Developing Functional, Reliable, and Secure Java Code
Use Java? If you do, you know that Java software can be used to drive application logic of Web services or Web applications. Perhaps you use it for desktop applications? Or, embedded devices? Whatever your use of Java code, functional errors are the enemy!
To combat this enemy, your team might already perform functional testing. Even so, you're taking significant risks if you have not yet implemented a comprehensive team-wide quality management strategy. Such a strategy alleviates reliability, security, and performance problems to ensure that your code is free of functionality errors.Read this article to learn about this simple four-step strategy that is proven to make Java code more reliable, more secure, and easier to maintain.