Flutter Web打包ZIP时卢比符号₹变为¹的问题解决求助
问题描述
我创建了包含卢比符号₹的TXT文件,直接从Flutter Web下载时符号显示正常,但使用archive包将其打包为ZIP后,解压发现卢比符号变为¹。尝试用Unicode写法输入该符号,问题仍存在。请问如何解决以保留ZIP内TXT文件的原卢比符号?
原代码
import 'package:flutter/material.dart'; import 'dart:html' as html; import 'package:archive/archive_io.dart' as webarc; void writeEssay() { String contentString = "Essay on Rupee: ₹"; webarc.ArchiveFile file = webarc.ArchiveFile.stream( "Rupee Essay.txt", contentString.length, webarc.InputStream(contentString.codeUnits), ); // Add file in archive final webarc.Archive archive = webarc.Archive(); archive.addFile(file); final webarc.OutputStream outputStream = webarc.OutputStream( byteOrder: webarc.LITTLE_ENDIAN, ); // Encode file into Zip file final webarc.ZipEncoder encoder = webarc.ZipEncoder(); final List<int>? bytes = encoder.encode(archive, level: webarc.Deflate.BEST_COMPRESSION, output: outputStream); // Download the Zip file. final html.Blob blob = html.Blob([bytes]); final String url = html.Url.createObjectUrlFromBlob(blob); final html.AnchorElement anchor = html.document.createElement('a') as html.AnchorElement ..href = url ..style.display = 'none' ..download = "Essay.zip"; html.document.body!.children.add(anchor); // download anchor.click(); }
解决方案
问题根源在于编码不匹配:
- Dart的
String.codeUnits返回UTF-16编码的代码单元,而TXT文件默认需要UTF-8编码才能正确解析多字节字符(比如卢比符号₹)。 - 原代码用
contentString.length作为文件长度,这是字符数量,但UTF-8中部分字符占多个字节(卢比符号占3字节),导致文件长度计算错误,引发解码异常。
修改步骤:
- 导入
dart:convert库,用于字符串与UTF-8字节数组的转换。 - 将
contentString.codeUnits替换为utf8.encode(contentString),生成正确的UTF-8字节流。 - 将文件长度参数从
contentString.length改为utf8.encode(contentString).length,确保字节长度准确。
修改后的代码:
import 'package:flutter/material.dart'; import 'dart:html' as html; import 'dart:convert'; // 新增编码转换库 import 'package:archive/archive_io.dart' as webarc; void writeEssay() { String contentString = "Essay on Rupee: ₹"; // 转换为UTF-8字节数组 List<int> utf8Bytes = utf8.encode(contentString); webarc.ArchiveFile file = webarc.ArchiveFile.stream( "Rupee Essay.txt", utf8Bytes.length, // 使用UTF-8字节长度作为文件长度 webarc.InputStream(utf8Bytes), // 传入UTF-8编码的字节流 ); // Add file in archive final webarc.Archive archive = webarc.Archive(); archive.addFile(file); final webarc.OutputStream outputStream = webarc.OutputStream( byteOrder: webarc.LITTLE_ENDIAN, ); // Encode file into Zip file final webarc.ZipEncoder encoder = webarc.ZipEncoder(); final List<int>? bytes = encoder.encode(archive, level: webarc.Deflate.BEST_COMPRESSION, output: outputStream); // Download the Zip file. final html.Blob blob = html.Blob([bytes]); final String url = html.Url.createObjectUrlFromBlob(blob); final html.AnchorElement anchor = html.document.createElement('a') as html.AnchorElement ..href = url ..style.display = 'none' ..download = "Essay.zip"; html.document.body!.children.add(anchor); // download anchor.click(); }
修改后,ZIP内的TXT文件将以UTF-8编码保存,解压后卢比符号可正常显示。
内容的提问来源于stack exchange,提问作者Tushar Goyani
相关产品推荐
相关产品推荐

