从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
相关产品推荐
相关产品推荐

