如果以最原始的inputstream outputstream为例,如果在键盘上敲个A字母,有几位大师说这个A在进入数据流之前,要先经过GBK的编码,使其变成一个字节的数据,这也是为什么一次read()就可以把A给读出来的原因。那么如果我把这个数据用read()读取,并用write()写入一个文本文件时,这个文本中记录的应该是A的GBK编码,没错吧? 那么我要是打开文本时,文本显示的是A,也就是说文本是如何知道用GBK编码来解读这个数据的? 我的程序如下,我在键盘上敲击A,在文本上显示的也确实是A,但有个问题想问一下,由于我敲击A时,在i中得到的实际是A的GBK码,也就是说文本中存在的是A的GBK码,哪是不是说文本是可以自动识别GBK码的?要不然无法解释为何在文本中能显示啊。 import java.io.*;
public class Test
{
public static void main(String [] args)
{
try
{
System.out.print("INPUT: ");
int i=System.in.read();
File file=new File("abc.txt");
FileOutputStream fos=new FileOutputStream(file);
fos.write(i); }catch(IOException e)
{
}
}
}
public class Test
{
public static void main(String [] args)
{
try
{
System.out.print("INPUT: ");
int i=System.in.read();
File file=new File("abc.txt");
FileOutputStream fos=new FileOutputStream(file);
fos.write(i); }catch(IOException e)
{
}
}
}
##############################################
例子:
String s="你好";
byte[] buf=s.getBytes("UTF-8"); //用指定的UTF-8编码
String s1=new String(buf,”GBK"); //用指定的GBK解码
System.out.println(s1);运行结果为乱码。
1)问:说这个A在进入数据流之前,要先经过GBK的编码?
答:要经过编码。(若是WIN平台,则是先经过GBK编码,若是LINUX,则是先经过UTF-8编码)
2)这个文本中记录的应该是A的GBK编码,没错吧?
答:可能是GBK或UTF-8,见1)
3)是如何知道用GBK编码来解读这个数据的?
答:当用编辑器打开文件时,若文件没有BOM字节数据,则按平台默认的编码(WIN下GBK,LINUX下UTF-8),若有BOM,则按BOM规定的编码处理
4)在键盘上敲击A,在文本上显示的也确实是A?
答:由于标准ASCII码字符在0-127之间,而无论是GBK还是UTF-8,对标准ASCII码字符编码都是一样的,因而:
“敲击A,在文本上显示的也确实是A”在任何平台都是正确的。但是:若楼主在WIN下输入一个汉字(如:‘啊’),将生成的这个文件在LINUX下打开,看到什么了?乱码了。