Re: [問題] InputStreamReader的read()

看板java作者 (十年一夢)時間10年前 (2015/02/08 22:35), 10年前編輯推噓1(103)
留言4則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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

02/08 23:48, , 1F
另可參見我這篇久遠之前的回文: #17vduTG2
02/08 23:48, 1F

02/08 23:49, , 2F
然後其實 0x10FFFF = 1114111 確實到百萬了
02/08 23:49, 2F

02/08 23:49, , 3F
只是 BMP 以外只有少數幾個 plane 有字而已
02/08 23:49, 3F

02/08 23:50, , 4F
而且沒記錯還有幾個 plane 整個是 Private use 的
02/08 23:50, 4F
※ 編輯: sbrhsieh (114.39.250.43), 02/09/2015 23:10:49
文章代碼(AID): #1KrtGfe9 (java)
討論串 (同標題文章)
文章代碼(AID): #1KrtGfe9 (java)