读取一个UTF-8编码格式的文件,代码中起初用FileReader读取到一个字符串,而后转换字符集,结果就出问题了:apache
文件读入时是按OS的默认字符集即GBK解码的,我先用默认字符集GBK编码str.getBytes(“GBK”),此时应该还原为文件中的字节序列了,数组
而后再按UTF-8解码,生成的字符串按理说应该就应该是正确的。函数
为何结果中仍是有部分乱码呢?工具
问题出在FileReader读取文件的过程当中,FileReader继承了InputStreamReader,但并无实现父类中带字符集参数的构造函数,编码
因此FileReader只能按系统默认的字符集来解码,而后在UTF-8 -> GBK -> UTF-8的过程当中编码出现损失,形成结果不能还原最初的字符。spa
以前还碰到过一个问题,读取一个别人上传的文件,原本约束是这个文件啊必须是UTF-8的,可是用户上传的文件,倒是用GBK对象
编码的,致使将这个文件流读出,使用时,发现乱码没法真确识别其中信息。继承
如何解决呢?字符串
首先,我无论源文件是采用什么编码,取得文件流,而后用org.apache.commons.io.IOUtils.toByteArray这个工具类中的APIget
FileInputStreamstream = new FileInputStream(targetFile);
byte[] bytes = IOUtils.toByteArray(stream);
这样,就将文件流转化成字节数组,而且不丢失字节;而后,每一个文件都有一段头信息,描述文件的字符编码,文件大小等等的信息,同一类字符编码的文件,
头几个字节是相同的,能够以此来判断文件的字符编码类型例如:UTF-8的文件,头2个字节,分别是‘-17’和‘-69’,;接着能够用String的带字符集的构造函数,
把文件还原出来。
另外,clps中不单须要读取源代码,还须要修改源代码,这时候,必定要保证编码格式的一致性,我采用的方式,模仿了文件的格式,返回给页面的
是一个文件对象,包含了文件内容实体,字符编码格式等信息,这样保存的时候,就能够获得这些信息。