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
相关产品推荐
相关产品推荐

