黑马程序员技术交流社区
标题:
关于编码问题,求教啊~不懂啊
[打印本页]
作者:
黄鸿达
时间:
2013-3-2 18:39
标题:
关于编码问题,求教啊~不懂啊
本帖最后由 黄鸿达 于 2013-3-11 17:58 编辑
import java.io.*;
public class a {
public static void main(String[] args) throws Exception {
String s="阿a√";//11.txt存的是这3个字符 阿a√ 编码模式不是utf-8是默认那个ascii
char[] carr=s.toCharArray();
for(int x=0;x<carr.length;x++){
System.out.println(carr[x]);
System.out.println((int)carr[x]);
}
System.out.println("-----------------------------------");
//第一个流
FileInputStream f=new FileInputStream("D:\\11.txt");
FileOutputStream fo=new FileOutputStream("D:\\33.txt");
int num=0;
while((num=f.read())!=-1){
System.out.println("整数"+num);
System.out.println("二进制"+Integer.toBinaryString(num));
fo.write(num);
}
System.out.println("-----------------------------------");
//第2个流
InputStreamReader isr=new InputStreamReader(
new FileInputStream("D:\\11.txt"),"GBK");
OutputStreamWriter osw=new OutputStreamWriter(
new FileOutputStream("D:\\22.txt"),"GBK");
int num1=0;
while((num1=isr.read())!=-1){
System.out.println("整数"+num1);
System.out.println("二进制"+Integer.toBinaryString(num1));
osw.write(num1);
}
fo.close();
f.close();
isr.close();
osw.close();
}
}
复制代码
阿
38463
a
97
√
8730
-----------------------------------
整数176
二进制10110000
整数162
二进制10100010
整数97
二进制1100001
整数161
二进制10100001
整数204
二进制11001100
-----------------------------------
整数38463
二进制1001011000111111
整数97
二进制1100001
整数8730
二进制10001000011010
复制代码
我不懂的是 第一个流用得平台默认编码读取,我是WIN中文的所以默认编码是GBK,第二个流用得是指定编码GBK,应该2个读取的数据是一样的,但是结果不一样
第一个
10110000
10100010是这个 第二个是这个
10010110 00111111 ,我查过GBK编码表,第一个是对的。所以第二个不属于GBK。
通过
阿
38463
a
97
√
8730
这个打印结果知道其实第二个是unicode的编码,但是为什么我用GBK读,就读出来unicode的编码?
作者:
lzw123451
时间:
2013-3-3 00:25
本帖最后由 李志卫 于 2013-3-3 01:59 编辑
1,String s="阿a√"; 这里阿a√ 是GBK的编码的字符串。 你文件上的阿a√ 是ASCII码储存,按GBK码表显示的文本。记事本默认用GBK打开,一般。因为GBK可以向下兼容ASCII码,还能显示中文。
2、 第一个流既然你是用ASCII码储存的,那么字节流读取的就是一ASCII形式储存的字节,字节流只会按照硬盘上的字节数据读取,和什么编码没什么干系。
3、第二个流,以GBK读取文本文件,按道理都应该以GBK的编码显示。这里也和上面字符串返回的整数一样。 Unicode的字符都是两个字节表示,这里不可能是Unicode码显示的,你的“a”才用一个字节显示。 我试了下,也不会是UTF-8的编码。
作者:
吴硕
时间:
2013-3-3 16:52
第二个确实是Unicode编码,原因如下:
Java中所有的字符、字符串都是Unicode编码,字符读取流读取出来的数据都是Unicode编码,不管你的文件是什么编码,到Java中都是Unicode编码(中间有一个转换过程)
字节读取流读取的字节会保持原编码
在你的例子中,第一个是gbk编码,第二个是Unicode编码
阿
Unicode: 963F 1001 0110 0011 1111
GBK: B0A2 1011 0000 1010 0010
作者:
黄鸿达
时间:
2013-3-3 21:37
本帖最后由 黄鸿达 于 2013-3-3 21:39 编辑
吴硕 发表于 2013-3-3 16:52
第二个确实是Unicode编码,原因如下:
Java中所有的字符、字符串都是Unicode编码,字符读取流读取出来的数 ...
System.out.println("-----------------------------------");
InputStreamReader isr=new InputStreamReader(
new FileInputStream("D:\\11.txt"),"GBK");
OutputStreamWriter osw=new OutputStreamWriter(
new FileOutputStream("D:\\22.txt"),"GBK");
int num1=0;
while((num1=isr.read())!=-1){
System.out.println("整数"+num1);
System.out.println("二进制"+Integer.toBinaryString(num1));
osw.write(num1);
}
System.out.println("-----------------------------------");
InputStreamReader isr1=new InputStreamReader(
new FileInputStream("D:\\44.txt"),"UTF-8");
OutputStreamWriter osw1=new OutputStreamWriter(
new FileOutputStream("D:\\55.txt"),"UTF-8");
int num11=0;
while((num11=isr1.read())!=-1){
System.out.println("整数"+num11);
System.out.println("二进制"+Integer.toBinaryString(num11));
osw1.write(num11);
}
System.out.println("-----------------------------------");
InputStreamReader isr2=new InputStreamReader(
new FileInputStream("D:\\66.txt"),"Unicode");
OutputStreamWriter osw2=new OutputStreamWriter(
new FileOutputStream("D:\\77.txt"),"Unicode");
int num12=0;
while((num12=isr2.read())!=-1){
System.out.println("整数"+num12);
System.out.println("二进制"+Integer.toBinaryString(num12));
osw2.write(num12);
复制代码
嗯,通过这个可以知道得到的是UNICODE,因为都说JAVA内部char String 都是unicode保存的嘛,api文档中char 数据类型(和 Character 对象封装的值)基于原始的 Unicode 规范,将字符定义为固定宽度的 16 位实体,String 表示一个 UTF-16 格式的字符串。
但是我又不知道他怎么查的表,除了第一个流是直接取出那个原始字节,第二个包括我后面加的流,都是用指定编码读取然后转化成相同的内部字符,拿个“阿”来说,得到的都是38463,对应10110000 10100010。说他是UNICODE码,但是你用,比如String s="阿" 把s.getByte(“unicode”)又得不出10110000 10100010这个来哦。所以我不知道他查表,得出这个38463的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2