You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字节),导致文件长度计算错误,引发解码异常。

修改步骤:

  1. 导入dart:convert库,用于字符串与UTF-8字节数组的转换。
  2. 将contentString.codeUnits替换为utf8.encode(contentString),生成正确的UTF-8字节流。
  3. 将文件长度参数从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 01:52:53