前端使用shpjs库处理shp压缩文件(.zip),在没有.cpg文件的情况下会出现中文乱码问题。.cpg文件中定义了字符编码的格式,通过shp.js源码,可以看出是parseDbf这个库的函数解析dnf文件需要获取字符编码格式(encoding),最简单的方法是将整个shpjs模块复制到src下面,再修改函数shp.parseZip下面调用parseDbf的部分
原来
dbf = parseDbf(zip[name + '.dbf'], zip[name + '.cpg'])
修改为:
dbf = parseDbf(zip[name + '.dbf'], 'gb2312')
但好像直接修改代码不太好,所以研究发现可以使用JSZip进行操作:
源代码:
reader.readAsArrayBuffer(event.target.files[0]); reader.addEventListener( "load", async () => { var zipData = reader.result // 解压 var zip = await JSZip.loadAsync(zipData) // 没有文件需要添加 if (! Object.keys(zip['files']).some(item => item.includes('.cpg'))) { var fileName = Object.keys(zip['files'])[0] fileName = fileName.substring(0, fileName.indexOf('.')) + '.cpg' zip.file(fileName, "gb2312"); //压缩 zipData = await zip.generateAsync({type: 'arraybuffer'}) } // 处理 shpjs(zipData).then((res) => {/*处理shpjs读取完后返回值*/} }, false );