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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:48:23