cursor.getString()丢失特殊字符求助:引号及重音标记被剥离
问题分析与解决办法
问题根源
这既不是Java String的限制,也不是SQLiteQueryBuilder的问题,是Android平台上SQLiteCursor的getString()方法在字符串解码环节的处理异常。iOS能正常读取说明数据库本身的存储是正确的,问题出在Android端的解码逻辑上——getString()可能默认用了非UTF-8的编码(比如你提到的ASCII)解析字段内容,导致带重音的字符和特殊单引号被错误处理。
解决办法
不需要底层处理,直接通过getBlob()配合UTF-8编码手动解码即可:
- 你代码里
new String(b, StandardCharsets.)未补全,改成StandardCharsets.UTF_8就能正确解析包含重音和特殊引号的字符串。 - 替换原有的
cursor.getString(0)逻辑,改用blob转UTF-8字符串的方式。
修改后的代码示例:
SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables("art"); cursor = qb.query(artDB, new String[] {"name"}, null, null, null, null, null); if (cursor == null) { closeDatabase(); return names;} if (cursor.getCount() > 0) { cursor.moveToFirst(); String s; do { // 用getBlob+UTF-8解码替代getString byte[] b = cursor.getBlob(0); s = new String(b, StandardCharsets.UTF_8); names.add(s); } while (cursor.moveToNext()); } cursor.close();
额外注意事项
- 确认数据库表的字符集配置,确保字段使用
utf8mb4编码(支持全Unicode字符,包括特殊单引号和重音字符),创建表语句示例:CREATE TABLE art (name TEXT COLLATE utf8mb4_unicode_ci); - 打开数据库时,可通过参数强制指定编码规则:
SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
内容的提问来源于stack exchange,提问作者tridiak
相关产品推荐
相关产品推荐

