作者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://webptt.com/cn.aspx?n=bbs/java/M.1423406121.A.A09.html
1F:推 LPH66: 另可参见我这篇久远之前的回文: #17vduTG2 02/08 23:48
2F:→ LPH66: 然後其实 0x10FFFF = 1114111 确实到百万了 02/08 23:49
3F:→ LPH66: 只是 BMP 以外只有少数几个 plane 有字而已 02/08 23:49
4F:→ LPH66: 而且没记错还有几个 plane 整个是 Private use 的 02/08 23:50
※ 编辑: sbrhsieh (114.39.250.43), 02/09/2015 23:10:49