神秘的转义字符

・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();
  }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值