※ 引述《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)。