InputStream is = new FileInputStream(file1);
OutputStream os = new FileOutputStream(file2);
int temp = 0;
while ((temp=is.read()!=(-1)) {
os.write(temp);
} 用这段代码将file1内容拷贝到file2中,每个汉字需要两次while循环,读写两次,每次一个字节,那么这个read()方法的返回值到底表示什么,api上说是下一个数据字节,但这里返回的显然是个int,那么这个介于0-255之间的int值表示什么呢?另外,Java采用Unicode编码,英文字母和汉字都是一个字符,为什么每个英文字母只要读取一次,而汉字需要读取两次?
OutputStream os = new FileOutputStream(file2);
int temp = 0;
while ((temp=is.read()!=(-1)) {
os.write(temp);
} 用这段代码将file1内容拷贝到file2中,每个汉字需要两次while循环,读写两次,每次一个字节,那么这个read()方法的返回值到底表示什么,api上说是下一个数据字节,但这里返回的显然是个int,那么这个介于0-255之间的int值表示什么呢?另外,Java采用Unicode编码,英文字母和汉字都是一个字符,为什么每个英文字母只要读取一次,而汉字需要读取两次?
为了将成千上万的文字统一到同一个编码机制之下,在兼顾经济的原则下,不管是东方文字还是西方文字,在Unicode中一律用两个字节来表示。也就是说,Unicode是一种双字节编码机制的字符集,使用0-65535之间的双字节无符号整数对每个字符进行编码。这样,在Unicode字符集中,至少可以定义65536个不同的字符,足以应付目前绝大多数场合的需要。
UTF-8 是一种不等幅的编码方式,UTF-8编码的字节长度取决于所要编码的字符在ISO 10646中的编码值。在UTF-8中,不同的字符,可能需要1-6个字节来进行编码。对于单字节的UTF-8编码,该字节的最高位为0,其余7位用来对字符进行编码(等同于ASCII码)。对于多字节的UTF-8编码,如果编码包含n个字节,那么第一个字节的前n位为1,第一个字节的第n+1位为0,该字节的剩余各位用来对字符进行编码。在第一个字节之后的所有的字节,都是最高两位为 "10 ",其余6位用来对字符进行编码。
UTF-16也是Unicode的变形表示方式的一种。它的目的是维持双八位的编码方式,同时也用一些特殊的双八位来表示ISO 10646中非基本多文种平面(BMP)中的一些字符。这种用来表示非BMP字符的方法在Unicode中称作代理对机制。
代理对的编码机制以及原先不需要代理对的六万三千多个基本 Unicode 码,合起来叫做UTF-16。也就是说UTF-16 基本上就是 Unicode双字节编码的实现,再加上一个应付未来扩充需要的编码机制。