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

Android使用Intent发送CSV邮件附件 Excel打开非拉丁字符乱码

解决方案

乱码问题本质是微软Excel对UTF-8编码CSV的识别逻辑特殊:默认情况下Excel会优先使用Windows系统默认编码(通常为GBK/GB2312)读取CSV文件,无法自动识别无BOM头的UTF-8编码文件,而其他工具如文件浏览器、Gmail预览均支持自动识别UTF-8编码,因此不会出现乱码。

最优修复方案:为CSV文件添加UTF-8 BOM头

UTF-8 BOM是位于文件开头的三个特殊字节(0xEF 0xBB 0xBF),专门用于标识该文件为UTF-8编码,添加后Excel就能正常识别非拉丁字符,同时不影响其他工具打开文件。同时以下代码顺便修复了原代码中两处多余的右括号语法问题。

修改后的代码示例:

private void writeCSV(String data, int year) {
    try {
        // 先获取文件输出流,写入UTF-8 BOM头
        FileOutputStream fos = getActivity().openFileOutput(year+"_Report.csv", Context.MODE_PRIVATE);
        fos.write(0xef);
        fos.write(0xbb);
        fos.write(0xbf);
        // 再用UTF-8编码的输出流写入实际内容
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
        outputStreamWriter.write(data);
        outputStreamWriter.close();
        fos.close();

        File file=new File(requireActivity().getFilesDir(),year+"_Report.csv");

        Intent shareIntent = new Intent(Intent.ACTION_SEND);

        shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Title");

        Uri uri = FileProvider.getUriForFile(requireActivity(),"FileProvider",
                file);
        shareIntent.setDataAndType(uri,"application/vnd.ms-excel");
        shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
        shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        shareIntent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
        shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        Intent chooser = Intent.createChooser(shareIntent, "Choose mail");
        List<ResolveInfo> resInfoList = getActivity().getPackageManager().queryIntentActivities(chooser, PackageManager.MATCH_DEFAULT_ONLY);
        for (ResolveInfo resolveInfo : resInfoList) {
            String packageName = resolveInfo.activityInfo.packageName;
            getActivity().grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
        }

        startActivity(chooser);

    } catch (Exception e) {
        e.printStackTrace();
        Log.e(TAG, e.getMessage());
    } 
}

其他可选方案

  • 如果你的使用场景仅面向简体中文用户,也可以将输出编码改为GBK,但该方案兼容性较差,非中文系统的Excel打开仍会乱码,且其他默认使用UTF-8编码的工具打开会出现乱码,不推荐使用。
  • 若不想修改生成代码,可告知用户打开CSV时使用Excel的「数据」-「自文本/CSV」导入功能,手动选择UTF-8编码读取文件即可。

内容的提问来源于stack exchange,提问作者Palantiir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:27:04