1

我找不到解决方案。我将数据存储到本地 SQLITE DB 中。一切正常,除了重音词。如图所示。

在此处输入图像描述

但是,如果我尝试使用 SqliteManager(Firefox 插件)存储重音单词,一切正常。总之:当我使用我的应用程序存储重音单词时,会出现奇怪的字符。我使用以下代码写入数据(读取相同)。基本上,所有字符串都是 UTF8 编码的。

-(NSInteger)writeData:(NSDictionary* )data table:(NSString* )table
{
    sqlite3_stmt    *sqlStatement;
    NSMutableArray  *columns   = [[NSMutableArray alloc] init];
    NSMutableArray  *values    = [[NSMutableArray alloc] init];
    NSMutableDictionary *temp = [[NSMutableDictionary alloc] initWithDictionary:data];
    @try {
        assert([data count] != 0);
        if ([[data allKeys] count] == 0) return 1;


        [temp removeObjectForKey:@"id"];
        [columns addObjectsFromArray:[temp allKeys]];
        NSString        *cols      = [columns componentsJoinedByString:@","];
        NSMutableString *colNames  = [[NSMutableString alloc] initWithString:
                                      [NSString stringWithFormat:@"INSERT INTO %s (",[table UTF8String]]];

        [colNames appendString:cols];
        [colNames appendString:@")"];

        // VALUES FOR  INSERT
        [values addObjectsFromArray:[temp allValues] ];
        NSMutableString *s = [[NSMutableString alloc] init];
        for(int i = 0; i < [values count]; i++)
        {
            [s setString:[NSString stringWithFormat:@"%@",[values objectAtIndex:i]]];
            const char* currentValue = [s UTF8String];
            [values setObject:[NSString stringWithFormat:@"\"%s\"",currentValue] atIndexedSubscript:i];
        }
        NSString        *vals       = [values componentsJoinedByString:@","];
        NSMutableString *valNames   = [[NSMutableString alloc] initWithString:@" VALUES ("];
        [valNames appendString:vals];
        [valNames appendString:@")"];

        [colNames appendString:valNames];
        const char *sql = [colNames UTF8String];
#ifdef DEBUG
         NSLog(@"avvDB writeDATA insert string %@",colNames);
#endif

        if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
        {
            NSLog(@"Problem with prepare statement write %s",sqlite3_errmsg(db));
            return 0;

        }
        if (sqlite3_exec(db, sql, NULL, NULL, NULL) == SQLITE_OK)
        {
           // NSLog(@"Last id %llu %s",sqlite3_last_insert_rowid(db),sqlite3_errmsg(db));
        }

    }// end try
    @catch(NSException* e)
    {
        NSLog(@"Eccezione in write %@",[e reason]);
    }
    @finally {
        sqlite3_reset(sqlStatement);
        sqlite3_finalize(sqlStatement);
        sqlStatement = nil;
        return sqlite3_last_insert_rowid(db);
    }


}
4

1 回答 1

2

%s运算符不支持 unicode 字符。正如字符串编程指南字符串格式说明符所说,它是“8 位无符号字符的空终止数组”。

坦率地说,出于其他原因,您无论如何都不应该使用stringWithFormat(如果其中一个字符串中有引号怎么办……您的 SQL 语句将失败;您甚至会受到 SQL 注入攻击)。您应该使用?占位符(不带引号),然后调用sqlite3_bind_text要绑定到相应问号的每个参数(注意,sqlite3_bind_xxx函数使用基于 1 的索引,与sqlite3_column_xxx使用基于 0 的索引不同)。

于 2013-10-22T07:36:53.480 回答