不久前,我遇到了字符串中不可见字符的问题。 因为它们是不可见的,所以它们确实会引起混乱。
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
不可见的标识符
想象一下我对发现您可以在Java:P中的标识符中使用不可见字符的反应。 这些字符不能出现在Java标识符的开头,但可以出现在其他任何位置。
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(_?+_?+_??);
运行时打印
Hello World !!
因此,我们有三个标识符都显示相同的标识符,因为它们的名称中具有不同的不可见字符!
令人惊讶的是,此代码编译,运行并打印了可能在标识符中但未启动的所有字符。 该代码包含\ u202e ,它确实使代码的显示混乱。
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);
参考: Vanilla Java博客上来自我们的JCG合作伙伴 Peter Lawrey的隐藏代码 。
翻译自: https://www.javacodegeeks.com/2012/09/java-hidden-code.html