flutter 使用archive压缩与解压文件时出现中文乱码的问题

这篇具有很好参考价值的文章主要介绍了flutter 使用archive压缩与解压文件时出现中文乱码的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

archive 是 flutter 上的一个文件压缩与解压的类库,支持 zip,tar,zlip,gzip,zip2,xz 格式的压缩与解压。

archive 的使用

archive 主要通过 Archive,ArchiveFile,ZipEncoder,ZipDecoder 三个类来实现文件的压缩和解压。
ArchiveFile 表示压缩包内的一个文件。
Archive 表示一个压缩包。
ZipEncoder 表示 zip 编码器。
ZipDecoder 表示 zip 解码器。

文件压缩:

final zipFile = File("text.zip");   
final archive = Archive();  
var str="中文";
final archiveFile=ArchiveFile.string("test.txt", str); //将压缩内容添加到ArchiveFile
archive.addFile(archiveFile);  //将ArchiveFile添加到Archive
final zipData = ZipEncoder().encode(archive);  //使用zip编码
zipFile.writeAsBytesSync(zipData!);  //写入到压缩文件

文件解压:

final zipFile = File("text.zip");
var archive=ZipDecoder().decodeBytes(zipFile.readAsBytesSync()); //读取文件内容,使用ZipDecoder解码
ArchiveFile? f=archive.findFile("test.txt");  //从压缩包内寻找文件
var content=f?.content;  //获取内容

乱码分析

对于非中文内容来说,直接使用以上代码来实现压缩和解压是不会导致乱码,但是对于中文来说却会导致乱码。
首先来分析 ArchiveFile.string() 方法做了什么。

ArchiveFile.string(this.name, String content,  
    [this._compressionType = STORE]) {  
  size = content.length;  
  _content = Uint8List.fromList(content.codeUnits);  
  _rawContent = InputStream(_content);  
}

能看到,该方法首先获取传入字符串的 utf-16 编码的列表,再将其转为 uint8 列表。uint8 在 flutter 中表示 8 位比特(bit)的无符号数,范围为 [0,256)。因为文件就是按字节(Byte)存储的,一个字节由 8 位比特组成,范围跟 uint8 一致。
但是对于中文来说,大小是超过 256 的,所以当使用 Uint8List.fromList() 将中文从 utf-16 强转为 uint8,会导致其被截断,从而导致乱码。
从下面测试例子中也能看出来:

String str="中文";  
var list=str.codeUnits;  
print(list);  
var list2=Uint8List.fromList(list);  
print(list2);

//运行结果为:
[20013, 25991]
[45, 135]

所以对于中文来说,并不能直接强制为 uint8,需要对其进行编码再进行存储,中文编码方式存在 utf-8,gbk 等,而 flutter 支持 utf-8 编码,但不支持 gbk 编码。对于 utf-8 编码来说,中文需要 3 个字节来存储。

utf8.encode(); //编码
utf8.decode(); //解码

我们再来看,ArchiveFile 的构造方法除了 ArchiveFile.string() 外,还有

ArchiveFile(this.name, this.size, dynamic content,  
    [this._compressionType = STORE]) {  
  name = name.replaceAll('\\', '/');  
  if (content is Uint8List) {  
    _content = content;  
    _rawContent = InputStream(_content);  
    if (size <= 0) {  
      size = content.length;  
    }  
  } else if (content is InputStream) {  
    _rawContent = InputStream.from(content);  
    if (size <= 0) {  
      size = content.length;  
    }  
  } else if (content is InputStreamBase) {  
    _rawContent = content;  
    if (size <= 0) {  
      size = content.length;  
    }  
  } else if (content is TypedData) {  
    _content = Uint8List.view(content.buffer);  
    _rawContent = InputStream(_content);  
    if (size <= 0) {  
      size = (_content as Uint8List).length;  
    }  
  } else if (content is String) {  
    _content = content.codeUnits;  
    _rawContent = InputStream(_content);  
    if (size <= 0) {  
      size = content.codeUnits.length + 1;  
    }  
  } else if (content is List<int>) {  
    // Legacy  
    // This expects the list to be a list of bytes, with values [0, 255].  
    _content = content;  
    _rawContent = InputStream(_content);  
    if (size <= 0) {  
      size = content.length;  
    }  
  } else if (content is FileContent) {  
    _content = content;  
  }  
}

当传入的 content 类型为 List<int> 时,直接赋值为 _content,没有进行额外的操作。另外该方法还有另外一个参数 _compressionType,该参数需要传入 ArchiveFile.STORE,否则在进行解压时,archiveFile.content 会报错:Unhandled Exception: RangeError: Value not in range: -6128

解决办法

所以最后处理中文乱码的解决办法就是先对其进行 utf-8 编码,再压缩。解压后,对其进行 utf-8 解码,获取中文内容。
代码如下:文章来源地址https://www.toymoban.com/news/detail-598479.html

//压缩
final zipFile = File("text.zip");  
final archive = Archive();  
var str="中文";
//这步是必须的
var encodeStr=utf8.encode(str);   
//必须要为ArchiveFile.STORE
final archiveFile=ArchiveFile("test.txt",str.length,encodeStr,ArchiveFile.STORE); 
archive.addFile(archiveFile);  
final zipData =  ZipEncoder().encode(archive);  
zipFile.writeAsBytesSync(zipData!);  

//解压
ArchiveFile? 
f=ZipDecoder().decodeBytes(zipFile.readAsBytesSync()).findFile("test.txt");  
var content=f?.content;  
// 解码
print(utf8.decode(content));

到了这里,关于flutter 使用archive压缩与解压文件时出现中文乱码的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于ESP8266串口输出中文时出现乱码的解决方案

    本人之前并没有c语言的项目编程经验,第一次使用ESP8266以及Eclipse编程环境,因此犯了诸多新手会犯的错误,但在网上查找相关问题时发现许多初级错误并不能完整的找到解决办法,因此希望将个人踩过的坑分享出来,如果有初学者遇到类似问题可以得到较快解决方案。 日前

    2024年02月03日
    浏览(37)
  • 便捷解压Keka for Mac(压缩解压工具) v1.3.3中文版

    Keka mac是一款文件压缩和解压缩软件,为Mac系统用户提供便捷、高效的文件管理工具。 Keka mac软件特点和功能 多种压缩格式支持:Keka支持多种常见的压缩格式,包括ZIP、7Z、RAR、TAR、GZIP等。它能够方便地创建和提取这些压缩文件,满足您不同的需求。 快速解压:Keka具有快速

    2024年02月07日
    浏览(30)
  • Linux 压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法

    Linux 压缩、解压文件的方式有如下几种: tar 是一种常用的打包工具,可以将多个文件或目录打包成一个 tar 包,也可以将一个 tar 包解压缩到指定的目录。 1.1. 压缩: 1.2. 解压: 1.3. tar 命令各参数含义 tar 命令是 Linux 下常用的打包和压缩工具,用于将多个文件或目录打包成一

    2024年02月10日
    浏览(36)
  • 【Linux笔记】压缩、解压文件的 4 种方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法

    目录 1、使用 tar 命令: 1.1. 压缩: 1.2. 解压: 1.3. tar 命令各参数含义 2. gzip、gunzip gzip 命令: 压缩文件: 保留原始文件,创建压缩文件: 保留原始文件,显示压缩进度: gunzip 命令: 解压文件: 保留压缩文件,创建原始文件: 保留压缩文件,显示解压进度: 3. zip、unzip

    2024年02月03日
    浏览(32)
  • Linux文件压缩与解压

    目录 1、分步压缩 1.1、文件打包 1.2、关于为何需要f参数 1.3、压缩包 2、分步解压 2.1、解压 2.2、解包 3、一步压缩与解压       在Windows上我们常用压缩软件完成文件的压缩,在Linux上我们可以使用命令来完成文件压缩。         首先,任意创建两个测试文件:main.c 和 test。

    2024年02月08日
    浏览(24)
  • 【Linux】文件的压缩和解压

             欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、压缩格式 2、压缩软件 3、tar  命令简介 4、tar  命令压缩  5、总结 在市面上有非常多的文件压缩格式,常见的文件压缩格式有如下几种: ①   z ip  格式

    2024年02月08日
    浏览(25)
  • Eclipse打开Java文件时出现乱码问题

    在使用Eclipse进行Java开发时,有时可能会遇到打开Java文件时出现乱码的情况。这种问题通常是由于文件编码不一致或者编码设置不正确所导致的。下面我将为你提供一些解决这个问题的方法。 检查文件编码设置: 在Eclipse中,每个Java文件都有一个编码设置。如果文件的编码设

    2024年02月04日
    浏览(27)
  • 【linux】linux系统压缩文件与解压文件

    linux系统中的压缩包有: zip,tar,gzip tar格式:简单的打包,并不会压缩,所以实际上打包好的压缩包是比源文件大的。 gzip格式:这个格式是通过一定的算法,把源文件大小进行压缩后打包,实际压缩包会比源文件小。 语法: tar [参数们] 文件1 文件2 文件3 参数: -c 创建压

    2024年01月18日
    浏览(26)
  • node.js文件的压缩解压

    第一步先要弄清楚为什么需要压缩和解压文件,这是因为文件太大了,我们需要将文件进行压缩,既然压缩了。后期就需要对其进行解压缩。我们要考虑最坏的打算,文件过于大,电脑内存没办法一步获取并且存储这么大的文件,所以我们需要使用到流式的方法来处理文件。

    2024年02月02日
    浏览(28)
  • 忘记了压缩包密码,怎么解压文件?

    压缩包带有密码,想要解压文件就必须要输入压缩包密码才能解压出文件的。 所以建议大家,在给压缩包加密之后,一定要设置简单的密码或者是记住密码、或者把密码记录在一个地方。一个压缩包名对应一个密码,这样以后就算忘记了密码,也有迹可循。 但是如果设置了

    2024年02月15日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包