编码相关基础:
参考http://blog.csdn.net/youyue/article/details/4580402
http://blog.163.com/asd_wll/blog/static/21031040201361043947625/
首先获取的中文字符是从内存数据库获取的,是一直存储在内存中的,所以是unicode编码,然后输出到csv文件时,默认是采用系统的编码格式进行写文件。那么在某个linux系统就是UTF_8,在windows就是GBK。生成的文件是什么编码格式的,那么在系统中打开时,就需要选择相应的解码格式来打开文件。
注意:在ORACLE数据库的话,他是有编码格式的。所以读取时,要确保是数据库设定的编码格式。
当在linux中生成的csv文件是UTF_8编码的,拿到windows系统用excel打开时,由于excel默认采用操作系统的编码即GBK进行解码,所以导致解码错误,出现乱码且错行。
但用文本编辑器如UE打开就没有问题,因为它可以自适应根据文件的编码格式进行解码打开文件。
如果需要用excel打开的话,可以用文本编辑器打开然后另存为选择操作系统可以识别的编码,那么再用excel打开的话就没问题。
像平时有的文件,强制用UE打开的时候,也会出现一堆二进制,那也是解码格式和文件的编码格式不一致导致的,这种情况由于文件实际是正确的,因此选择正确的解码方式进行解码打开文件就可以了。
编码基础
不管是中文字符还是英文字符等所有字符,在java的内存中都是以unicode编码比如UTF-8存储的。
读写文件也不一定非得用什么编码写。只要写和读采用相同的编码就不会出错。
比如某个文件(含中文)是UTF-8编码格式,那么在java文件编写读入该文件的时候,就得用OutputStreamWriter(UTF-8)进行解码,这样在编译java文件时读入的数据才会是正确的。
Java文件编写完成后就要进行编译,在java文件中数据读取都会存储到对象中,即存储在内存中,而内存中都是unicode编码的,所以从文件读取时采用正确的编码格式解码,那么读取的文件信息就是正确的。存储到内存中时,java虚拟机会自动将其转换为unicode编码格式的信息,那么信息也是正确的。
要注意的是编写java文件时,java文件也是有编码格式的(即每个文件都是有编码格式的)。比如UTF-8。那么编译时,若是命令行采用javac进行编译,若未指定编码类型,那么就会采用操作系统默认的编码类型来编码,比如在中文windows系统中,默认是GBK,此时编译的话就会出现乱码,即编译生成的class文件就乱码了,那么后续就无法恢复了,除非是再重新编译。所以一定要注意编译时的类型,这也是为什么在windows系统编写的文件,拿到linux系统中编译会出现问题的原因,windows写的文件一般是GBK的,而linux编码一般是UTF-8或UTF-16的,所以在linux编译的话就会出错。
当然,在输出的时候可以指定编码格式,比如new OutputStreamWriter(os,“GBK”);
那么写出的文件就是GBK格式的,在windows系统查看就会没问题。但是在linux系统中查看可能就会有问题,比如linux有个第三方软件默认编码是系统编码即UTF-8,那么用来解析GBK的就会出错。
但是在IDE环境中,比如eclipse和IDEA,它可以为每个java文件设置字符编码类型,而内置的编译器就会根据此设置来编译java文件。
保证java文件编译生成的class文件没有问题后,那么后续输出出现乱码的话,就可以进行相应解决了。