Re: [問題] InputStreamReader的read()

作者: sbrhsieh (十年一夢)   2015-02-08 22:35:17
※ 引述《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)。
作者: LPH66 (-6.2598534e+18f)   2015-02-08 23:48:00
另可參見我這篇久遠之前的回文: #17vduTG2然後其實 0x10FFFF = 1114111 確實到百萬了只是 BMP 以外只有少數幾個 plane 有字而已而且沒記錯還有幾個 plane 整個是 Private use 的

Links booklink

Contact Us: admin [ a t ] ucptt.com