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

Android应用读取CSV文件非英文字符显示乱码问题求助

解决Android读取UTF-8 CSV文件非英文字符乱码问题

你的问题根源很明确:读取CSV文件时没有指定UTF-8编码。FileReader会默认使用Android系统的默认字符编码(通常不是UTF-8),而你的CSV文件是UTF-8编码的,编码不匹配就导致非英文字符显示为�。

问题分析

你复制文件的代码是用字节流(InputStream/FileOutputStream)直接复制,这部分完全没问题——字节流复制不会修改文件的编码格式,所以复制后的文件依然是UTF-8编码。问题出在读取文件的环节:FileReader没有指定编码,用了系统默认编码去解析UTF-8的字节,导致乱码。

解决方案

把FileReader替换为InputStreamReader,并明确指定UTF-8编码。这样就能正确解析文件中的非英文字符了。

修改后的读取代码如下:

BufferedReader br = null;
try {
    File a = new File(getFilesDir().getPath() + "/CSV_RAW");
    if(a.isFile()) Log.e("TEST", "file exists");
    
    // 关键修改:用InputStreamReader指定UTF-8编码
    br = new BufferedReader(new InputStreamReader(new FileInputStream(a), StandardCharsets.UTF_8));
    int count = 0;
    String ln;
    
    while((ln = br.readLine()) != null) {
        if (ln.indexOf(',') != -1) count++;
    }
    
    // 重新打开文件时也要用指定编码的InputStreamReader
    br = new BufferedReader(new InputStreamReader(new FileInputStream(a), StandardCharsets.UTF_8));
    ln = br.readLine();
    arr = new String[count];
    count = 0;
    
    while((ln = br.readLine()) != null) {
        if (ln.indexOf(',') != -1){
            arr[count] = getName(ln);
            count ++;
        }
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 记得关闭流,避免资源泄漏
    if (br != null) {
        try {
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

额外提示

  • 确保导入java.nio.charset.StandardCharsets类(Android API 19及以上支持),如果需要兼容更低版本,可以用字符串"UTF-8"代替StandardCharsets.UTF_8。
  • 如果你的CSV文件带有UTF-8 BOM(字节顺序标记),InputStreamReader默认会把BOM当作普通字符读取,可能导致第一行开头出现奇怪字符。这种情况下可以用带BOM处理的输入流,或者提前用Notepad++去除BOM(选择“UTF-8无BOM”编码保存)。

内容的提问来源于stack exchange,提问作者גיא שחר

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:47:57