FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题(转)...

文件编码处理技巧
本文探讨了文件编码转换过程中出现乱码的原因及解决方案,通过利用工具类API将文件流转化为字节数组,再依据文件头部信息判断编码类型,最终正确还原文件内容。

读取一个UTF-8编码格式的文件,代码中起初用FileReader读取到一个字符串,然后转换字符集,结果就出问题了:

文件读入时是按OS的默认字符集即GBK解码的,我先用默认字符集GBK编码str.getBytes(“GBK”),此时应该还原为文件中的字节序列了,

然后再按UTF-8解码,生成的字符串按理说应该就应该是正确的。

为什么结果中还是有部分乱码呢?

问题出在FileReader读取文件的过程中,FileReader继承了InputStreamReader,但并没有实现父类中带字符集参数的构造函数,

所以FileReader只能按系统默认的字符集来解码,然后在UTF-8 -> GBK -> UTF-8的过程中编码出现损失,造成结果不能还原最初的字符。

之前还碰到过一个问题,读取一个别人上传的文件,本来约束是这个文件啊必须是UTF-8的,但是用户上传的文件,却是用GBK

编码的,导致将这个文件流读出,使用时,发现乱码无法真确识别其中信息。

如何解决呢?

首先,我不管源文件是采用什么编码,取得文件流,然后用org.apache.commons.io.IOUtils.toByteArray这个工具类中的API

FileInputStreamstream = new FileInputStream(targetFile);

byte[] bytes = IOUtils.toByteArray(stream);

这样,就将文件流转化成字节数组,并且不丢失字节;然后,每个文件都有一段头信息,描述文件的字符编码,文件大小等等的信息,同一类字符编码的文件,

头几个字节是相同的,可以以此来判断文件的字符编码类型例如:UTF-8的文件,头2个字节,分别是‘-17’和‘-69’,;接着可以用String的带字符集的构造函数,

把文件还原出来。

另外,clps中不单需要读取源代码,还需要修改源代码,这时候,一定要保证编码格式的一致性,我采用的方式,模仿了文件的格式,返回给页面的

是一个文件对象,包含了文件内容实体,字符编码格式等信息,这样保存的时候,就可以得到这些信息。

根据提供的信息,虽未直接提及 `fileReader.readAsArrayBuffer` 读取 `.bin` 文件无法触发 `onload` 回调的解决办法,但可以从原理和常见问题方面进行推测解答。 当使用 `FileReader.readAsArrayBuffer` 读取 `.bin` 文件时无法触发 `onload` 回调,可能有以下几种情况及解决办法: ### 文件读取失败 如果文件读取过程中出现错误,`onload` 回调将不会触发,而是触发 `onerror` 回调。因此可以添加错误处理逻辑,查看是否是读取错误导致的。 ```javascript function readBinFile(file) { var reader = new FileReader(); reader.onload = function(event) { console.log(event.target.result); }; reader.onerror = function(event) { console.error('文件读取错误:', event.target.error); }; reader.readAsArrayBuffer(file); } // 假设 file 是一个 .bin 文件对象 // readBinFile(file); ``` ### 文件对象无效 确保传入 `readAsArrayBuffer` 方法的文件对象是有效的。可以在读取前进行简单的检查。 ```javascript function onChange(event) { var file = event.target.files[0]; if (file) { readBinFile(file); } else { console.error('未选择有效的文件'); } } ``` ### 浏览器兼容性问题 虽然 `FileReader` 是比较通用的 API,但仍可能存在浏览器兼容性问题。可以检查浏览器是否支持 `FileReader` 以及 `readAsArrayBuffer` 方法。 ```javascript if (typeof FileReader === 'undefined' || !FileReader.prototype.readAsArrayBuffer) { console.error('当前浏览器不支持 FileReader 或 readAsArrayBuffer 方法'); } ``` ### 异步操作问题 确保在正确的上下文中执行文件读取操作,避免异步操作导致问题。例如,在某些情况下,文件对象可能在读取操作执行前就已经被销毁或无效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值