作者sbrhsieh (十年一夢)
看板java
標題Re: [問題] InputStreamReader的read()
時間Sun Feb 8 22:35:17 2015
※ 引述《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