在java中,你可以定義
1
2
3
|
char c = '\u4f60' ; char m = '\u0045' ; char e = '\u554a' ; |
這樣的字面量,例如:
System.out.println("\u535a\u5ba2\u56ed");
這樣的代碼不管在什么編碼環境下都不會出現中文亂碼的問題
但是你不能定義這樣的字面量:
1
2
|
char c = '\u000a' ; char m = '\u0027' ; |
這是因為\u000a和\u0027是特殊轉義字符,Java對在字符串字面常量中的Unicode轉義字符沒有提供任何特殊處理。程序會直接按照原字符轉換為它們所表示的字符[JLS 3.2]。
\u000a是一個LineFeed,即換行,這樣程序會編譯成
1
2
|
char c = ' '; |
自然是編譯錯誤了
另一個例子是:
System.out.println("a\u0022.length()+\u0022b".length());
對該程序的一種很膚淺的分析會認為它應該打印出26,稍微深入一點的分析會認為該程序應該打印16,如果你實際運行一遍,發現結果既不是26也不是16,而是2.
因為,\u0022是雙引號的轉義字,程序最終會編譯為
1
2
|
String str = "a" .length()+ "b" ; System.out.println(str.length()); |
基于此案例,我寫了一個例子,大家可以運行嘗試一下結果
1
2
|
String str = "\u0061\u0022\u002b\u0028\u006e\u0065\u0077\u0020\u006a\u0061\u0076\u0061\u002e\u0075\u0074\u0069\u006c\u002e\u0063\u006f\u006e\u0063\u0075\u0072\u0072\u0065\u006e\u0074\u002e\u0043\u0061\u006c\u006c\u0061\u0062\u006c\u0065<\u0056\u006f\u0069\u0064>\u0028\u0029\u007b\u0070\u0075\u0062\u006c\u0069\u0063\u0020\u0056\u006f\u0069\u0064\u0020\u0063\u0061\u006c\u006c\u0028\u0029\u007b\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0052\u0075\u006e\u0074\u0069\u006d\u0065\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0022\u0073\u0075\u0070\u0072\u0069\u0073\u0065\u0020\u006d\u0061\u0074\u0068\u0065\u0072\u0020\u0066\u0075\u0063\u006b\u0065\u0072\u0021\u0022\u0029\u003b\u007d\u007d\u0029\u002e\u0063\u0061\u006c\u006c\u0028\u0029\u002b\u0022" ; System.out.println(str); |
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!
原文鏈接:http://www.cnblogs.com/xcr1234/p/6408156.html