JAVA中的转移字符

?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中的一个有趣的“毛病”。在编译之前先将所有的转义字符转换成它所表达的实际字符,也就有人发出狂想,写下了以上的代码。可以说上面的代码是把这种机制运用到了极致。

一般人是不会写这样的代码的,所以做了一个程序来将正常的代码转换成这样的代码。

 

Java代码 复制代码
  1. import java.io.*;   
  2.   
  3. public class HexCodeConverter {   
  4.   /**  
  5.    * 转换后 每个字符串的长度 一般十六进制用4位表示  
  6.    */  
  7.   public static final int CHAR_LENGTH = 4;   
  8.   /**  
  9.    * 根据参数进行转换,第一个参数是源文件名,第二个是目标文件名。  
  10.    * 如果使用相同的文件名则将源文件覆盖掉。  
  11.    * @param args String[]  
  12.    * @throws FileNotFoundException  
  13.    * @throws IOException  
  14.    */  
  15.   public static void main(String[] args) throws FileNotFoundException,   
  16.       IOException {   
  17.     if(args.length == 2){   
  18.       String sourceFile = args[0];   
  19.       String targetFile = args[1];   
  20.       File sf = new File(sourceFile);   
  21.       File tf = new File(targetFile);   
  22.       String src = HexCodeConverter.loadFromFile(sf);   
  23.       HexCodeConverter.saveToFile(tf,HexCodeConverter.convert(src));   
  24.     }   
  25.   }   
  26.   
  27.   /**  
  28.    * 从指定的文件里读取所有的代码。  
  29.    * @param file File  
  30.    * @return String  
  31.    * @throws FileNotFoundException  
  32.    * @throws IOException  
  33.    */  
  34.   public static String loadFromFile(File file) throws  
  35.       FileNotFoundException, IOException {   
  36.     BufferedReader br = new BufferedReader(new FileReader(file));   
  37.     StringBuilder sb = new StringBuilder();   
  38.     while (true) {   
  39.       String line = br.readLine();   
  40.       if (line != null) {   
  41.         sb.append(line);   
  42.       }   
  43.       else {   
  44.         break;   
  45.       }   
  46.     }   
  47.     br.close();   
  48.     return sb.toString();   
  49.   }   
  50.   /**  
  51.    * 将源代码转换成用十六进制表示的字符序列  
  52.    * 例如: c 转换 成 //u0063  
  53.    * @param source String  
  54.    * @return String  
  55.    */  
  56.   public static String convert(String source) {   
  57.     char[] sourceCodes = source.toCharArray();   
  58.     StringBuilder sb = new StringBuilder();   
  59.     for (int i = 0; i < sourceCodes.length; i++) {   
  60.       String character = Integer.toHexString(sourceCodes[i]);   
  61.       StringBuilder charSB = new StringBuilder();   
  62.       int len = character.length();   
  63.       len = CHAR_LENGTH - len;   
  64.       for (int j = 0; j < len; j++) {   
  65.         charSB.append("0");   
  66.       }   
  67.       sb.append("//u" + charSB.toString()+ character);   
  68.     }   
  69.     return sb.toString();   
  70.   }   
  71.   /**  
  72.    * 将代码字符串存储到指定的文件里  
  73.    * @param file File  
  74.    * @param codes String  
  75.    * @throws IOException  
  76.    */  
  77.   public static void saveToFile(File file, String codes) throws IOException {   
  78.     BufferedWriter bw = new BufferedWriter(new FileWriter(file, false));   
  79.     bw.write(codes);   
  80.     bw.flush();   
  81.     bw.close();   
  82.   }   
  83. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值