前端往读取到的压缩文件里添加文件,针对了shapefile(shp)压缩文件里没有.cfg导致中文乱码的情况

发布时间 2023-08-04 14:31:49作者: doraemon22333

  前端使用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
);