Flutter带重音资源文件名使用问题及编码修改位置咨询
Flutter M1 Mac设备上带重音SVG资源文件名编码问题解决
问题场景
在M1 Mac Mini设备上构建Flutter Android或iOS镜像时,带重音的SVG资源文件名会被重编码:
- 原始文件名:
AA.svg AÓ.svg AÍ.svg - 构建后重命名为:
AA.svg AO%CC%81.svg AI%CC%81.svg
尝试通过SvgPicture.asset("AÓ.svg")或SvgPicture.asset("media/cikkcsoport/AO%CC%81.svg")加载资源时,均报错:Unable to load asset: media/cikkcsoport/AO%CC%81.svg
更新信息
创建测试项目使用相同SVG文件可正常加载,查看模拟器文件系统发现测试项目中文件名采用不同编码:
A%C3%81.svg A%C3%8D.svg A%C3%93.svg
解决方法
1. 统一资源文件名的Unicode归一化形式
Mac系统默认使用NFC(Normalization Form C)存储文件名,而原项目中文件可能采用了NFD(Normalization Form D)格式(重音字符被分解为基础字符+重音标记),导致Flutter打包时编码差异。可通过终端命令批量转换文件名到NFC格式:
# 进入SVG资源所在目录 cd media/cikkcsoport # 批量转换所有SVG文件名为NFC格式 for file in *.svg; do mv "$file" "$(echo "$file" | uconv -x NFC)"; done
转换后,重音字符会被存储为单个Unicode字符(如Ó对应U+00D3),Flutter打包时会生成与测试项目一致的A%C3%93.svg类编码文件名,此时直接使用SvgPicture.asset("AÓ.svg")即可正常加载。
2. 在代码中手动处理文件名归一化与编码
若无法修改原始文件名,可通过Dart的unicode_normalization包在加载时转换文件名格式:
- 第一步,在
pubspec.yaml中添加依赖:dependencies: unicode_normalization: ^0.1.20 - 第二步,加载资源时转换文件名:
import 'package:unicode_normalization/unicode_normalization.dart'; import 'package:flutter_svg/flutter_svg.dart'; // 加载带重音的SVG资源 Widget loadAccentedSvg() { String originalFileName = "AÓ.svg"; // 转换为NFC归一化形式 String nfcFileName = originalFileName.normalize(NFC); // 进行URI编码匹配打包后的文件名 String encodedFileName = Uri.encodeComponent(nfcFileName); return SvgPicture.asset("media/cikkcsoport/$encodedFileName"); }
3. 升级Flutter到最新稳定版
部分旧版本Flutter对Mac系统下的文件名编码处理存在差异,升级到最新稳定版可能修复该问题:
flutter upgrade
升级完成后重新执行flutter clean和flutter build,验证文件名编码是否统一。
内容的提问来源于stack exchange,提问作者Ebadta
相关产品推荐
相关产品推荐

