乱码在Android Java开发中是常见问题,主要源于字符编码不一致或未正确处理编码转换,以下从多个典型场景出发,提供具体解决方法,帮助开发者高效排查和修复乱码问题。

网络请求乱码:明确请求与响应编码
网络接口返回数据显示为问号或乱码,通常因HTTP请求/响应未明确指定编码,或服务器返回编码与解析方式不匹配,解决需在请求和响应阶段统一使用UTF-8编码。
使用HttpURLConnection时,通过setRequestProperty设置请求头编码,并用InputStreamReader指定响应流编码:
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
InputStream inputStream = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
若使用OkHttp,可在Request.Builder中添加header("Accept-Charset", "UTF-8"),并通过response.body().string()直接获取UTF-8解码字符串(OkHttp默认处理UTF-8)。
文件读写乱码:显式指定流编码
读取或写入文本文件时出现乱码,往往因未显式指定文件编码,或文件本身保存编码与读取时不一致,需通过InputStreamReader和OutputStreamWriter明确使用UTF-8:
// 读取文件
FileInputStream fis = new FileInputStream("test.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
String content = reader.readLine();
// 写入文件
FileOutputStream fos = new FileOutputStream("test.txt");
OutputStreamWriter writer = new OutputStreamWriter(fos, "UTF-8");
writer.write("测试内容");
writer.flush();
同时需确保文件保存时编码为UTF-8(如在IDE中设置文件编码为UTF-8,避免使用GBK等本地编码)。

数据库乱码:确保连接与数据编码一致
SQLite数据库存储或查询数据时乱码,多因数据库连接未设置编码,或插入数据前编码转换错误,SQLite默认支持UTF-8,需确保数据插入前为UTF-8编码:
// 创建表(默认UTF-8,无需额外设置)
db.execSQL("CREATE TABLE IF NOT EXISTS user (name TEXT)");
// 插入数据(确保字符串编码正确)
String name = "测试";
ContentValues values = new ContentValues();
values.put("name", new String(name.getBytes("UTF-8"), "UTF-8"));
db.insert("user", null, values);
避免使用getBytes("ISO-8859-1")转UTF-8,确保原始数据来源(如网络请求、文件读取)已正确解码为UTF-8。
UI显示乱码:检查控件编码与字体支持
TextView等控件显示乱码,可能因传入字符串编码错误,或字体文件缺失导致无法渲染特定字符,需确保传入控件的字符串为UTF-8编码,并使用系统支持中文的字体:
String text = "测试内容"; textView.setText(text); // 默认UTF-8,确保text来源编码正确 // 若需自定义字体,在res/font/添加字体文件 textView.setTypeface(ResourcesCompat.getFont(context, R.font.custom_font));
同时检查res/values/strings.xml中的字符串是否正确,避免硬编码非UTF-8字符(如直接复制粘贴带有特殊格式的文本)。

日志输出乱码:统一IDE与控制台编码
Logcat日志显示乱码,通常因IDE或控制台编码与项目编码不一致,需在Android Studio中设置全局编码为UTF-8:进入File > Settings > Editor > File Encodings,将Global Encoding、Project Encoding和Default encoding for properties files均设为UTF-8,命令行使用adb logcat时,可通过chcp 65000(Windows)设置控制台编码为UTF-8,确保中文日志正常显示。
乱码问题的核心在于编码一致性,开发中需统一使用UTF-8编码,在数据传输(网络)、存储(文件、数据库)、显示(UI)各环节显式指定编码,并确保IDE、工具链支持UTF-8,可有效避免乱码问题。


















