国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

flutter 使用archive壓縮與解壓文件時出現(xiàn)中文亂碼的問題

這篇具有很好參考價值的文章主要介紹了flutter 使用archive壓縮與解壓文件時出現(xiàn)中文亂碼的問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

archive 是 flutter 上的一個文件壓縮與解壓的類庫,支持 zip,tar,zlip,gzip,zip2,xz 格式的壓縮與解壓。

archive 的使用

archive 主要通過 Archive,ArchiveFile,ZipEncoder,ZipDecoder 三個類來實(shí)現(xiàn)文件的壓縮和解壓。
ArchiveFile 表示壓縮包內(nèi)的一個文件。
Archive 表示一個壓縮包。
ZipEncoder 表示 zip 編碼器。
ZipDecoder 表示 zip 解碼器。

文件壓縮:

final zipFile = File("text.zip");   
final archive = Archive();  
var str="中文";
final archiveFile=ArchiveFile.string("test.txt", str); //將壓縮內(nèi)容添加到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()); //讀取文件內(nèi)容,使用ZipDecoder解碼
ArchiveFile? f=archive.findFile("test.txt");  //從壓縮包內(nèi)尋找文件
var content=f?.content;  //獲取內(nèi)容

亂碼分析

對于非中文內(nèi)容來說,直接使用以上代碼來實(shí)現(xiàn)壓縮和解壓是不會導(dǎo)致亂碼,但是對于中文來說卻會導(dǎo)致亂碼。
首先來分析 ArchiveFile.string() 方法做了什么。

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

能看到,該方法首先獲取傳入字符串的 utf-16 編碼的列表,再將其轉(zhuǎn)為 uint8 列表。uint8 在 flutter 中表示 8 位比特(bit)的無符號數(shù),范圍為 [0,256)。因?yàn)槲募褪前醋止?jié)(Byte)存儲的,一個字節(jié)由 8 位比特組成,范圍跟 uint8 一致。
但是對于中文來說,大小是超過 256 的,所以當(dāng)使用 Uint8List.fromList() 將中文從 utf-16 強(qiáng)轉(zhuǎn)為 uint8,會導(dǎo)致其被截斷,從而導(dǎo)致亂碼。
從下面測試?yán)又幸材芸闯鰜恚?/p>

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

//運(yùn)行結(jié)果為:
[20013, 25991]
[45, 135]

所以對于中文來說,并不能直接強(qiáng)制為 uint8,需要對其進(jìn)行編碼再進(jìn)行存儲,中文編碼方式存在 utf-8,gbk 等,而 flutter 支持 utf-8 編碼,但不支持 gbk 編碼。對于 utf-8 編碼來說,中文需要 3 個字節(jié)來存儲。

utf8.encode(); //編碼
utf8.decode(); //解碼

我們再來看,ArchiveFile 的構(gòu)造方法除了 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;  
  }  
}

當(dāng)傳入的 content 類型為 List<int> 時,直接賦值為 _content,沒有進(jìn)行額外的操作。另外該方法還有另外一個參數(shù) _compressionType,該參數(shù)需要傳入 ArchiveFile.STORE,否則在進(jìn)行解壓時,archiveFile.content 會報錯:Unhandled Exception: RangeError: Value not in range: -6128

解決辦法

所以最后處理中文亂碼的解決辦法就是先對其進(jìn)行 utf-8 編碼,再壓縮。解壓后,對其進(jìn)行 utf-8 解碼,獲取中文內(nèi)容。
代碼如下:文章來源地址http://www.zghlxwxcb.cn/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));

到了這里,關(guān)于flutter 使用archive壓縮與解壓文件時出現(xiàn)中文亂碼的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 關(guān)于ESP8266串口輸出中文時出現(xiàn)亂碼的解決方案

    關(guān)于ESP8266串口輸出中文時出現(xiàn)亂碼的解決方案

    本人之前并沒有c語言的項(xiàng)目編程經(jīng)驗(yàn),第一次使用ESP8266以及Eclipse編程環(huán)境,因此犯了諸多新手會犯的錯誤,但在網(wǎng)上查找相關(guān)問題時發(fā)現(xiàn)許多初級錯誤并不能完整的找到解決辦法,因此希望將個人踩過的坑分享出來,如果有初學(xué)者遇到類似問題可以得到較快解決方案。 日前

    2024年02月03日
    瀏覽(17)
  • 便捷解壓Keka for Mac(壓縮解壓工具) v1.3.3中文版

    便捷解壓Keka for Mac(壓縮解壓工具) v1.3.3中文版

    Keka mac是一款文件壓縮和解壓縮軟件,為Mac系統(tǒng)用戶提供便捷、高效的文件管理工具。 Keka mac軟件特點(diǎn)和功能 多種壓縮格式支持:Keka支持多種常見的壓縮格式,包括ZIP、7Z、RAR、TAR、GZIP等。它能夠方便地創(chuàng)建和提取這些壓縮文件,滿足您不同的需求。 快速解壓:Keka具有快速

    2024年02月07日
    瀏覽(26)
  • Linux 壓縮、解壓文件的 4 種方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法

    Linux 壓縮、解壓文件的方式有如下幾種: tar 是一種常用的打包工具,可以將多個文件或目錄打包成一個 tar 包,也可以將一個 tar 包解壓縮到指定的目錄。 1.1. 壓縮: 1.2. 解壓: 1.3. tar 命令各參數(shù)含義 tar 命令是 Linux 下常用的打包和壓縮工具,用于將多個文件或目錄打包成一

    2024年02月10日
    瀏覽(36)
  • 【Linux筆記】壓縮、解壓文件的 4 種方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法

    【Linux筆記】壓縮、解壓文件的 4 種方式。tar、gzip、gunzip、zip、unzip、7z命令使用方法

    目錄 1、使用 tar 命令: 1.1. 壓縮: 1.2. 解壓: 1.3. tar 命令各參數(shù)含義 2. gzip、gunzip gzip 命令: 壓縮文件: 保留原始文件,創(chuàng)建壓縮文件: 保留原始文件,顯示壓縮進(jìn)度: gunzip 命令: 解壓文件: 保留壓縮文件,創(chuàng)建原始文件: 保留壓縮文件,顯示解壓進(jìn)度: 3. zip、unzip

    2024年02月03日
    瀏覽(26)
  • Linux文件壓縮與解壓

    Linux文件壓縮與解壓

    目錄 1、分步壓縮 1.1、文件打包 1.2、關(guān)于為何需要f參數(shù) 1.3、壓縮包 2、分步解壓 2.1、解壓 2.2、解包 3、一步壓縮與解壓 ? ? ? 在Windows上我們常用壓縮軟件完成文件的壓縮,在Linux上我們可以使用命令來完成文件壓縮。 ? ? ? ? 首先,任意創(chuàng)建兩個測試文件:main.c 和 test。

    2024年02月08日
    瀏覽(15)
  • 【Linux】文件的壓縮和解壓

    【Linux】文件的壓縮和解壓

    ???????? 歡迎來到博主 Apeiron?的博客,祝您旅程愉快 !?時止則止,時行則行。動靜不失其時,其道光明。 目錄 1、壓縮格式 2、壓縮軟件 3、tar? 命令簡介 4、tar? 命令壓縮? 5、總結(jié) 在市面上有非常多的文件壓縮格式,常見的文件壓縮格式有如下幾種: ①?? z ip? 格式

    2024年02月08日
    瀏覽(22)
  • Eclipse打開Java文件時出現(xiàn)亂碼問題

    在使用Eclipse進(jìn)行Java開發(fā)時,有時可能會遇到打開Java文件時出現(xiàn)亂碼的情況。這種問題通常是由于文件編碼不一致或者編碼設(shè)置不正確所導(dǎo)致的。下面我將為你提供一些解決這個問題的方法。 檢查文件編碼設(shè)置: 在Eclipse中,每個Java文件都有一個編碼設(shè)置。如果文件的編碼設(shè)

    2024年02月04日
    瀏覽(23)
  • 【linux】linux系統(tǒng)壓縮文件與解壓文件

    【linux】linux系統(tǒng)壓縮文件與解壓文件

    linux系統(tǒng)中的壓縮包有: zip,tar,gzip tar格式:簡單的打包,并不會壓縮,所以實(shí)際上打包好的壓縮包是比源文件大的。 gzip格式:這個格式是通過一定的算法,把源文件大小進(jìn)行壓縮后打包,實(shí)際壓縮包會比源文件小。 語法: tar [參數(shù)們] 文件1 文件2 文件3 參數(shù): -c 創(chuàng)建壓

    2024年01月18日
    瀏覽(25)
  • 哈夫曼編碼&文件壓縮和解壓

    哈夫曼編碼&文件壓縮和解壓

    基本介紹 赫夫曼編碼也翻譯為 哈夫曼編碼(Huffman Coding),又稱霍夫曼編碼,是一種編碼方式, 屬于一種程序算法 赫夫曼編碼是赫哈夫曼樹在電訊通信中的經(jīng)典的應(yīng)用之一。 赫夫曼編碼廣泛地用于數(shù)據(jù)文件壓縮。其壓縮率通常在20%~90%之間 赫夫曼碼是可變字長編碼(VLC)的一種。

    2024年02月03日
    瀏覽(19)
  • node.js文件的壓縮解壓

    第一步先要弄清楚為什么需要壓縮和解壓文件,這是因?yàn)槲募罅?,我們需要將文件進(jìn)行壓縮,既然壓縮了。后期就需要對其進(jìn)行解壓縮。我們要考慮最壞的打算,文件過于大,電腦內(nèi)存沒辦法一步獲取并且存儲這么大的文件,所以我們需要使用到流式的方法來處理文件。

    2024年02月02日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包