jszip和pizzip中文乱码的解决方案

2024-01-29 09:12

本文主要是介绍jszip和pizzip中文乱码的解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

jszip中文乱码的解决方案

jszip官方文档地址:https://stuk.github.io/jszip/

1、问题分析

在JavaScript中需要用到对Zip压缩包进行操作时,我们往往会使用jszip对压缩包进行编辑。

但是,当我们使用jszip来读取包含中文名的文件时,文件名会出现乱码的情况。

下面的示例中我们使用jszip3.0版本来进行读取testZip.zip压缩包,压缩包中有三个中文的docx文件。

import JSZip from 'jszip'
import JSZipUtils from 'jszip-utils'export function useJSZip() {JSZipUtils.getBinaryContent('../../public/testZip.zip', function (err, data) {if (err) {throw err}JSZip.loadAsync(data).then(function (zip) {console.log(zip.files)/* Ђ• DOCX ΄••1.docxЂ• DOCX ΄••2.docxЂ• DOCX ΄••3.docx*/})})
}

代码中我们看到,本应该为新建 DOCX 文档1.docx的文件名变为了乱码,这种情况下使用file-saver进行保存时会出现问题。

通过查看jszip的官方文档,我们可以看到jszip在读取文件名时对文件名默认使用UTF-8的文件名解码。

一般中文压缩文件中的文件名都以gbk形式进行编码,而jszip在读取压缩包时,使用UTF-8解码gbk编码的文件名,这时就导致我们的文件名出现了乱码。

2、解决思路

通过上面的问题分析我们可以有两个解决思路。

1、第一个思路可以从jszip的编码上进行解决,参考官方文档,如果我们使用的是jszip3.0及以上的版本我们可以在loadAsync方法的options参数中自定义解码方法,这样jszip在读取文件名解码时会以回调函数的形式执行并接受我们自定义的解码器所传入的文件名。

当然如果我们是想配合docxtemplater进行模板文档功能的实现时,jszip3.0并不能满足需求,因为docxtemplater仅仅支持到jszip2.0的版本和docxtemplater基于jszip2.0封装的pizzip。在jszip2.0中我们需要使用load方法来读取文件,并在里面自定义解码器。pizzip是官方基于jszip2.0进行封装的更适合docxtemplater算法的一个包,解决方法和使用方法与jszip2.0相同。

2、第二个思路是在压缩包文件本身进行解决,将压缩包的中文编码改为utf-8即可。

3、解决方法

1、对于自定义编码,我们可以使用第三方解码器iconv-lite来实现gbk的解码。

# 安装iconv-lite
npm i iconv-lite --save
# 在浏览器中运行时可能会报错缺少buffer包,如果出错使用下面代码安装
npm i buffer -D

jszip3.0解决方法

import JSZip from 'jszip'
import JSZipUtils from 'jszip-utils'
import iconv from 'iconv-lite'export function useJSZip() {JSZipUtils.getBinaryContent('../../public/testZip.zip', function (err, data) {if (err) {throw err}// 指定options编码器JSZip.loadAsync(data, {decodeFileName: function (bytes) {// 使用iconv-lite解码return iconv.decode(bytes, 'gbk')},}).then(function (zip) {console.log(zip.files)/* 新建 DOCX 文档1.docx新建 DOCX 文档2.docx新建 DOCX 文档3.docx*/})})
}

jszip2.0解决方法

import JSZip from 'jszip'
import JSZipUtils from 'jszip-utils'
import iconv from 'iconv-lite'export function renderZip() {JSZipUtils.getBinaryContent('../../public/testZip.zip',function (err, data) {if (err) {throw err // or handle err}const zip = new JSZip()zip.load(data, {decodeFileName: function (bytes) {// 使用iconv-lite库来解码gbkreturn iconv.decode(bytes, 'gbk')},})console.log(zip.files)/* 新建 DOCX 文档1.docx新建 DOCX 文档2.docx新建 DOCX 文档3.docx*/})
}

pizzip解决方法

import PizZip from 'pizzip'
import PizZipUtils from 'pizzip/utils/index.js'
import iconv from 'iconv-lite'export function renderZip() {PizZipUtils.getBinaryContent('../../public/testZip.zip',function (err, data) {if (err) {throw err // or handle err}const zip = new PizZip()zip.load(data, {decodeFileName: function (bytes) {// 使用iconv-lite库来解码gbkreturn iconv.decode(bytes, 'gbk')},})console.log(zip.files)/* 新建 DOCX 文档1.docx新建 DOCX 文档2.docx新建 DOCX 文档3.docx*/})
}

注意

  • 配合docxtempater时推荐采用官方封装的pizzip进行,可以使用jszip2.0,但不能使用jszip3.0及以上版本,因为高版本jszip并没有被docxtemplater适配支持。
  • 使用jszip2.0pizzip时调用函数的方法基本一致,但是导入的方法不一致,jszip在浏览器端读取本地文件时需要单独安装jszip-utils包进行二进制数据的读取。而pizzip将读取二进制文件的方法集成到包中,只需要导入pizzip中的pizzip/utils/index.js即可。

这篇关于jszip和pizzip中文乱码的解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/656426

相关文章

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Python安装时常见报错以及解决方案

《Python安装时常见报错以及解决方案》:本文主要介绍在安装Python、配置环境变量、使用pip以及运行Python脚本时常见的错误及其解决方案,文中介绍的非常详细,需要的朋友可以参考下... 目录一、安装 python 时常见报错及解决方案(一)安装包下载失败(二)权限不足二、配置环境变量时常见报错及