程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java中關於本義字符的一個bug

java中關於本義字符的一個bug

編輯:關於JAVA

java中關於本義字符的一個bug。本站提示廣大學習愛好者:(java中關於本義字符的一個bug)文章只能為提供參考,不一定能成為您想要的結果。以下是java中關於本義字符的一個bug正文


在java中,你可以定義

char c =  '\u4f60';

char m =  '\u0045';

char e =  '\u554a';

這樣的字面量,例如:

System.out.println("\u535a\u5ba2\u56ed");

這樣的代碼不論在什麼編碼環境下都不會呈現中文亂碼的問題

 

但是你不能定義這樣的字面量:

char c = '\u000a'; 

char m = '\u0027'; 

這是由於\u000a和\u0027是特殊本義字符,Java對在字符串字面常量中的Unicode本義字符沒有提供任何特殊處置。順序會直接依照原字符轉換為它們所表示的字符[JLS 3.2]。

 

\u000a是一個LineFeed,即換行,這樣順序會編譯成

char c = '

';

自然是編譯錯誤了

 

 

另一個例子是:

System.out.println("a\u0022.length()+\u0022b".length());   

 

對該順序的一種很淺薄的剖析會以為它應該打印出26,略微深化一點的剖析會以為該順序應該打印16,假如你實踐運轉一遍,發現後果既不是26也不是16,而是2.

由於,\u0022是雙引號的本義字,順序最終會編譯為

String str = "a".length()+"b";

System.out.println(str.length());  

 

基於此案例,我寫了一個例子,大家可以運轉嘗試一下後果

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);

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved