You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从cordova.file.dataDirectory读取文件时遭遇ENCODING_ERR(错误码5)求助

解决Cordova读取文件时的ENCODING_ERR(错误码5)问题

咱来拆解下你遇到的这个编码错误,结合你的代码来看,大概率是这几个原因导致的,对应的解决办法也给你列出来了:

1. 文件编码不匹配readAsText的默认设置

FileReader.readAsText()默认用UTF-8编码解析文件,如果你的settings.dat是用其他编码(比如GBK、ASCII、ISO-8859-1)保存的,就会触发ENCODING_ERR。

解决办法:明确指定文件的实际编码作为readAsText的第二个参数,比如:

reader.readAsText(file, "GBK"); // 替换成你文件实际的编码

2. 文件内容损坏或包含不可解析的字节

如果settings.dat是空文件,或者里面有乱码、不符合编码规范的字节序列,readAsText也会报错。这种情况下可以先读取为二进制数据,再用容错模式解析:

修改代码示例:

reader.onloadend = function(){
    var buffer = this.result;
    // 用TextDecoder以容错模式解析,忽略无效字符
    var decoder = new TextDecoder("utf-8", {fatal: false});
    var data = decoder.decode(buffer);
    alert("ok: " + data);
};
reader.readAsArrayBuffer(file); // 先读取为ArrayBuffer

3. 路径拼接可能存在隐形问题

虽然你的代码里直接拼接了cordova.file.dataDirectory + filename,但有时候dataDirectory的末尾可能没有斜杠(不同平台可能有差异),导致路径无效,间接引发编码相关错误。更稳妥的方式是先获取目录入口,再通过getFile方法获取文件:

优化后的完整代码:

var filename = "settings.dat";
window.resolveLocalFileSystemURL(cordova.file.dataDirectory, function(dirEntry) {
    // 获取文件,create: false表示文件必须存在
    dirEntry.getFile(filename, {create: false}, function(fileEntry) {
        fileEntry.file(function(file) {
            var reader = new FileReader();
            reader.onloadend = function(){
                var data = this.result;
                alert("ok");
            };
            // 明确指定编码,避免默认值不匹配
            reader.readAsText(file, "UTF-8");
        }, function(res){
            alert(JSON.stringify(res));
        });
    }, function(res){
        alert(JSON.stringify(res));
    });
}, function(res){
    alert(JSON.stringify(res));
});

4. 额外排查点:确认文件是否存在且可访问

虽然错误码是ENCODING_ERR,但也可以先确认settings.dat确实存在于cordova.file.dataDirectory路径下,并且文件本身没有损坏。你可以用Cordova的file插件API列出目录内容,检查文件是否存在:

window.resolveLocalFileSystemURL(cordova.file.dataDirectory, function(dirEntry) {
    var reader = dirEntry.createReader();
    reader.readEntries(function(entries) {
        console.log("目录下的文件/文件夹:", entries);
        // 检查是否包含settings.dat
        var exists = entries.some(entry => entry.name === "settings.dat");
        alert("settings.dat是否存在:" + exists);
    }, function(err) {
        alert(JSON.stringify(err));
    });
}, function(err) {
    alert(JSON.stringify(err));
});

先从编码匹配这个点入手排查,应该能解决大部分情况,如果还是不行,再试试用ArrayBuffer的方式读取,或者检查文件本身的完整性。

内容的提问来源于stack exchange,提问作者Gianluca Ghettini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:22:04