【问题标题】:CSV File encoding on e-mail Intent电子邮件意图上的 CSV 文件编码
【发布时间】:2021-11-24 09:37:12
【问题描述】:

我有一个执行两个任务的函数:

  • 在数据/文件上创建一个 CSV 文件
  • 在电子邮件中附加文件

数据是从 REST API 原始接收的。 这是我的功能:

 private void writeCSV(String data, int year) {
    try {
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(getActivity().openFileOutput(year+"_Report.csv",
     Context.MODE_PRIVATE), StandardCharsets.UTF_8);
        outputStreamWriter.write(data);
        outputStreamWriter.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());
    } 
}

问题

我遇到的问题是 CSV 在设备文件资源管理器和电子邮件预览(即 Gmail)上是可读的,但是当我尝试在 Excel 上打开文件时,所有文本的编码都不正确(非拉丁文单词只是符号)。

提前谢谢你

【问题讨论】:

  • application/vnd.ms-excel 不是 CSV 的 MIME 类型。试试text/csv
  • @CommonsWare 似乎没有解决问题

标签: android css android-fragments android-intent android-fileprovider


【解决方案1】:

text/csv 并没有确切的规范,因此可以使用多种字符编码。

虽然某些程序可以通过使用文本字节顺序标记 (BOM) 作为第一个字符来帮助在某些情况下进行编码,但并非所有程序都支持这一点,尤其是 UTF8,因为它实际上不需要 BOM。

因此大多数程序假定系统使用的默认字符编码,但 Excel 和其他程序在打开文本/csv 文件时要求用户指定字符编码。

例如,在第 1 步中,您要求“文件来源”选择字符集。

https://support.microsoft.com/en-gb/office/text-import-wizard-c5b02af6-fda1-4440-899f-f78bafe41857

我发现 Android 程序大多假定或计算出文件的 UTF8 编码,因为这是默认值,但我发现 Excel 可以经常默认为 UTF16,这导致它错误地将 2 个字符读取为 1这往往在 UTF16 字符集中较高,结果看起来像符号。

因此,实际上由用户在导入时选择正确的字符集或在 csv 文件开头添加 0xEF,0xBB,0xBF 的 UTF8 BOM 对内存中的 Excel 有效。

【讨论】:

    猜你喜欢
    • 2017-12-09
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多