?Java的转义字符有如下:
/n 回车(/u000a)
/t 水平制表符(/u0009)
/b 空格(/u0008)
/r 换行(/u000d)
/f 换页(/u000c)
/' 单引号(/u0027)
/" 双引号(/u0022)
// 反斜杠(/u005c)
/ddd 三位八进制
/udddd 四位十六进制
?史上最牛的 java 代码,代码如下:
/u0070/u0075/u0062/u006c/u0069/u0063/u0020/u0063/u006c/u0061/u0073/u0073/u0020/u0048/u0065/u006c/u006c/u006f/u0057/u006f/u0072/u006c/u0064/u0020/u007b/u0020/u0020/u0070/u0075/u0062/u006c/u0069/u0063/u0020/u0073/u0074/u0061/u0074/u0069/u0063/u0020/u0076/u006f/u0069/u0064/u0020/u006d/u0061/u0069/u006e/u0028/u0053/u0074/u0072/u0069/u006e/u0067/u005b/u005d/u0020/u0061/u0072/u0067/u0073/u0029/u0020/u007b/u0020/u0020/u0020/u0020/u0053/u0079/u0073/u0074/u0065/u006d/u002e/u006f/u0075/u0074/u002e/u0070/u0072/u0069/u006e/u0074/u006c/u006e/u0028/u0022/u0048/u0065/u006c/u006c/u006f/u0020/u0057/u006f/u0072/u006c/u0064/u0020/u0021/u0022/u0029/u003b/u0020/u0020/u007d/u007d
猜猜这些东西能编译吗?如果可以会输出什么呢??嘿嘿。。酷吧?想知道结果就继续看。。
答案是能够编译,会打印 Hello World ! 。怎么样 很酷吧????想要运行就把那对字符拷贝下来,然后复制到一个名为 :HelloWorld.java的文件里。编译运行都OK。他代表的实际代码如下:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World !");
}
}
如果你感到疑惑,现在就来讲解。那就是Java中的一个有趣的“毛病”。在编译之前先将所有的转义字符转换成它所表达的实际字符,也就有人发出狂想,写下了以上的代码。可以说上面的代码是把这种机制运用到了极致。
一般人是不会写这样的代码的,所以做了一个程序来将正常的代码转换成这样的代码。
- import java.io.*;
- public class HexCodeConverter {
- /**
- * 转换后 每个字符串的长度 一般十六进制用4位表示
- */
- public static final int CHAR_LENGTH = 4;
- /**
- * 根据参数进行转换,第一个参数是源文件名,第二个是目标文件名。
- * 如果使用相同的文件名则将源文件覆盖掉。
- * @param args String[]
- * @throws FileNotFoundException
- * @throws IOException
- */
- public static void main(String[] args) throws FileNotFoundException,
- IOException {
- if(args.length == 2){
- String sourceFile = args[0];
- String targetFile = args[1];
- File sf = new File(sourceFile);
- File tf = new File(targetFile);
- String src = HexCodeConverter.loadFromFile(sf);
- HexCodeConverter.saveToFile(tf,HexCodeConverter.convert(src));
- }
- }
- /**
- * 从指定的文件里读取所有的代码。
- * @param file File
- * @return String
- * @throws FileNotFoundException
- * @throws IOException
- */
- public static String loadFromFile(File file) throws
- FileNotFoundException, IOException {
- BufferedReader br = new BufferedReader(new FileReader(file));
- StringBuilder sb = new StringBuilder();
- while (true) {
- String line = br.readLine();
- if (line != null) {
- sb.append(line);
- }
- else {
- break;
- }
- }
- br.close();
- return sb.toString();
- }
- /**
- * 将源代码转换成用十六进制表示的字符序列
- * 例如: c 转换 成 //u0063
- * @param source String
- * @return String
- */
- public static String convert(String source) {
- char[] sourceCodes = source.toCharArray();
- StringBuilder sb = new StringBuilder();
- for (int i = 0; i < sourceCodes.length; i++) {
- String character = Integer.toHexString(sourceCodes[i]);
- StringBuilder charSB = new StringBuilder();
- int len = character.length();
- len = CHAR_LENGTH - len;
- for (int j = 0; j < len; j++) {
- charSB.append("0");
- }
- sb.append("//u" + charSB.toString()+ character);
- }
- return sb.toString();
- }
- /**
- * 将代码字符串存储到指定的文件里
- * @param file File
- * @param codes String
- * @throws IOException
- */
- public static void saveToFile(File file, String codes) throws IOException {
- BufferedWriter bw = new BufferedWriter(new FileWriter(file, false));
- bw.write(codes);
- bw.flush();
- bw.close();
- }
- }