看板 java 關於我們 聯絡資訊
※ 引述《OoShiunoO (機機勳)》之銘言: : 最近在看歐萊裡的JAVA網路程式設計 : 裡面有講到這段code: : InputStreamReader r = new InputStreamReader(in, "MacCyrillic"); : StringBuilder sb = new StringBuilder(); : int c; : while((c=r.read()) != -1) sb.append((char) c); : return sb.toString(); : 他是讀取某個輸入串流in,並以MacCyrillic編碼轉換為unicode字串輸出。 : 其中read()會回傳0~65535的int,這代表Unicode字元, : 我的問題是為什麼只會回傳0~65535而已?Unicode編碼不是有好幾百萬個嗎? : 另外,(char)這個強制轉型是把int轉成char,它的轉換標準是依據什麼呢? 我建議直接看一下 java.lang.String, java.lang.Character API doc。 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html http://docs.oracle.com/javase/7/docs/api/java/lang/Character.html JRE 對 Unicode 的支援是版本相依的,早期的 JRE(1.5-)只支援所謂的 BPM: \u0000 ~ \uFFFF 這範圍,所以 Java char 是 2 bytes,在記憶體的 bits layout 同 byte/short/int/long 這一類的 integral type(2's complement),只差 char 是 unsigned。 API doc 指出 Java 1.7 支援 Unicode Standard v6,unicode 的範圍是 \u0000 ~ \u10FFFF。 確實有些字是無法單用一個 char 來存其 unicode 碼,這時候會使用兩個 char 來 代表一個字(surrogate pair)。 大致上來說 Java 1.5 開始去支援 BPM 以外的字,所以 Character class 中 許多 method 都引進吃 int type 的 overloading 版本(本來吃 char)。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.171.202.86 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1423406121.A.A09.html
LPH66: 另可參見我這篇久遠之前的回文: #17vduTG2 02/08 23:48
LPH66: 然後其實 0x10FFFF = 1114111 確實到百萬了 02/08 23:49
LPH66: 只是 BMP 以外只有少數幾個 plane 有字而已 02/08 23:49
LPH66: 而且沒記錯還有幾個 plane 整個是 Private use 的 02/08 23:50
※ 編輯: sbrhsieh (114.39.250.43), 02/09/2015 23:10:49