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,提问作者גיא שחר
相关产品推荐
相关产品推荐

