2012-03-07 17 views
0

私は、アプリケーションデータ(キリル文字列)をsqliteに格納します。そのデータをアプリに表示しようとすると、テキストの代わりに変な文字が表示されます。データを取得する方法は次のとおりです。sqliteデータベースからデータを取得中に壊れたエンコーディング

あなたはsqliteのデータベースUTF-8ではなくUTF-16を使用している、あなたはおそらく使用して幸せになるつもりだと仮定すると、
-(NSString *)getData 
{ 
    sqlite3 *database; 

    if(sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) 
    { 
     sqlite3_close(database); 
    } 

    NSString *query = [NSString 
         stringWithFormat:@"SELECT name FROM users WHERE kind = '%@' ORDER BY RANDOM() LIMIT 1", self.kind ]; 
    sqlite3_stmt *statement; 

    NSString *selectedQuestion; 

    if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) 
    { 
     sqlite3_step(statement); 
     selectedQuestion =[NSString stringWithFormat: @"%s",(char *)sqlite3_column_text(statement, 0)]; 
     sqlite3_finalize(statement); 
    } 

    sqlite3_close(database); 

    return selectedQuestion; 
} 
+0

:CONST char * query = "SELECT ....."; – DJPlayer

+0

SQLite_prepare_v2(データベース、[クエリUTF8String]、-1、&ステートメント、nil)== SQLITE_OK) – OhDoh

答えて

3

selectedQuestion = [NSString stringWithUTF8String: (char*)sqlite3_column_text(statement,0)]; 

そして、より一般的に:

selectedQuestion = [NSString stringWithCString: (char*) sqlite3_column_text(statement,0) encoding: ENCODING]; 

は、NULに安全な他のエンコーディングに使用できます。たとえば、UTF16の場合はENC​​ODINGをNSUTF16StringEncodingに置き換えます(また、事前にわかっていて、マーカーが存在することが期待できない場合は、BEとLEバージョンのバリエーションがあります)。 NUL終端されないエンコーディングの

、あなたが使用することができます。

PTRと長さは、上記のように、文字列とENCODINGの位置と長さを持っている
selectedQuestion = [[[NSString alloc] initWithBytes: ptr length: length encoding: ENCODING] autorelease]; 

を、利用可能リストからエンコードを示し、エンコーディング

+0

ありがとう!それはトリックでした! – OhDoh

0

このパーティーには少し出ましたが、sqlite3 BLOBタイプの列にUTF16データを文字列から保存してこの問題を解決しました。ここで

は私が(マイナスエラーチェック)何をしたかのスケッチです:

1)ブロブを持つテーブルを作成します。読み取り時に

// "text" is the NSString you want to save 
sqlite3_stmt *w_statement = nil; 
sqlite3_prepare_v2(database,"INSERT INTO my_table (my_text) VALUES (?);", -1, &w_statement, NULL); 
NSData *utf16Data = [text dataUsingEncoding:NSUTF16LittleEndianStringEncoding]; 
sqlite3_bind_blob(w_statement, 1, [utf16Data bytes], [utf16Data length], NULL); 
sqlite3_step(w_statement); 

3):挿入する場合

sqlite3_exec(database, "CREATE TABLE my_table (my_text BLOB NOT NULL);"); 

2)、ブロブにあなたの声明を準備するようにしてください、あなたのクエリに変更した場合に何が起こるか

// statement is your select statement 
const void *textBytes = sqlite3_column_blob(statement, 1); 
NSData *textData = [NSData dataWithBytes:textBytes length:(sqlite3_column_bytes(statement, 1))]; 
NSString *text = [[NSString alloc] initWithData:textData encoding:NSUTF16LittleEndianStringEncoding]; 
関連する問題