Арабская строка в NSMutableArray или NSMutableDictionary - PullRequest
2 голосов
/ 19 января 2012

У меня проблема при добавлении арабской строки в NSMutableArray или NSMutableDictionary.

Пример:

NSMutableDictionary *data = [[NSMutableDictionary alloc]init];
[data setObject:@"فرسان" forKey:@"name"];

NSLog(@"%@",data);

Вывод:

2012-01-18 21:55:05.646 aa[367:207] {
    name = "\U0641\U0631\U0633\U0627\U0646";
}

моя проблема точно, я сохраняю эти данные в sqlite [data objectForKey: @ "name"] его сохраненные \ U0641 \ U0631 \ U0633 \ U0627 \ U0646 и при получении данных, чтобы поместить их в UILabel или что-нибудь подобное тексту будет \ U0641 \U0631 \ U0633 \ U0627 \ U0646

Любая помощь?Спасибо:)

- (void)SaveMessage {

NSMutableDictionary *TableProperties = [[NSMutableDictionary alloc]init];
[TableProperties setObject:@"INSERT" forKey:@"Operation"];
[TableProperties setObject:@"savedmessages" forKey:@"tableName"];
NSString *string = [[NSString alloc]initWithFormat:@" %@",MessageBox.text];
[TableProperties setValue:string forKey:@"message"];

NSString *msgResult;
NSArray *result = [[DatabaseFunctions database] DataBaseOperation:TableProperties];
if ([[result objectAtIndex:0] isEqualToString:@"Done"]) 
    msgResult = @"تم حفظ الرسالة بنجاح";
else
    msgResult = @"لم تت العملية بنجاح حاول لاحقا";

UIAlertView *alert = [[UIAlertView alloc]
                      initWithTitle:@"حفظ الرسالة" 
                      message:msgResult 
                      delegate:self 
                      cancelButtonTitle:@"موافق" 
                      otherButtonTitles:nil, nil ];
[alert show];

}

- (NSArray *)DataBaseOperation:(NSMutableDictionary *)TableProperties{

NSMutableArray *retval = [[NSMutableArray alloc] init];

NSString *Operation = [TableProperties objectForKey:@"Operation"];

if ([Operation isEqualToString:@"SELECT" ]) {

        NSString *tableColumns = [TableProperties objectForKey:@"tableColumns"];
        NSString *tableName    = [TableProperties objectForKey:@"tableName"];
        NSString *tableWhere   = [TableProperties objectForKey:@"tableWhere"];
        NSString *tableOrder   = [TableProperties objectForKey:@"tableOrder"];
        NSString *tableLimit   = [TableProperties objectForKey:@"tableLimit"];

        NSString *Query;
        if ([tableLimit isEqualToString:@"NO"]) {
            Query = [[NSString alloc] initWithFormat:@"SELECT %@ FROM %@ WHERE %@ ORDER BY %@",
                     tableColumns,tableName,tableWhere,tableOrder,tableLimit];
        }else{
            Query = [[NSString alloc] initWithFormat:@"SELECT %@ FROM %@ WHERE %@ ORDER BY %@ LIMIT %@",
                     tableColumns,tableName,tableWhere,tableOrder,tableLimit];
        }

        NSArray *FieldArray = [[TableProperties objectForKey:@"tableColumns"] componentsSeparatedByString:@","];

        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(_database, [Query UTF8String], -1, &statement, nil) == SQLITE_OK) {
            while (sqlite3_step(statement) == SQLITE_ROW) {

                NSMutableDictionary *Row = [[NSMutableDictionary alloc]init];
                NSString *uniqueId = [[NSString alloc] initWithFormat:@"%i",sqlite3_column_int(statement, 0)];
                [Row setObject:uniqueId forKey:@"uniqueId"];

                for (int i = 1; i<[FieldArray count]; i++) {

                    NSString *column = [[NSString alloc] initWithUTF8String:(char *) sqlite3_column_text(statement, i)];
                    [Row setObject:column forKey:[FieldArray objectAtIndex:i]];

                }
                Objects *rowOfTable = [[Objects alloc] initSelectDataFromTables:Row];                        
                Row = nil;

                [retval addObject:rowOfTable];
            }
            sqlite3_finalize(statement);
        }
}
else if([Operation isEqualToString:@"INSERT" ]) {

    NSString *tableName = [TableProperties objectForKey:@"tableName"];

    [TableProperties removeObjectForKey:@"Operation"];
    [TableProperties removeObjectForKey:@"tableName"];

    NSArray *Columns = [TableProperties allKeys];
    NSArray *Values = [TableProperties allValues];

    NSString *Query = [[NSString alloc] initWithFormat:@"INSERT INTO %@ %@ VALUES %@",tableName,Columns,Values];


    sqlite3_stmt *statement;
    if (sqlite3_prepare_v2(_database, [Query UTF8String], -1, &statement, nil) == SQLITE_OK) 
        if (SQLITE_DONE!=sqlite3_step(statement)){
            NSLog(@"Error when inserting  %s",sqlite3_errmsg(_database));
            [retval addObject:@"Error"];

        }else{
            NSLog(@"Data inserted Successfully");
            [retval addObject:@"Done"];
        }
    else{
        NSLog(@"Error when inserting  %s",sqlite3_errmsg(_database));
        [retval addObject:@"Error"];
    }
    sqlite3_finalize(statement); 
}
return retval;

}

1 Ответ

6 голосов
/ 19 января 2012

Когда вы регистрируете объект, используя %@, NSLog отправляет объекту сообщение description и печатает полученную строку.

NSDictionary отвечает на сообщение description кодированиемего ключи и значения в «безопасном» формате, экранируя символы, не входящие в ASCII, используя коды \U####.

Если вы передадите арабскую строку в NSLog напрямую, она просто напечатает строку без escape-кодов:

NSMutableDictionary *data = [[NSMutableDictionary alloc]init];
[data setObject:@"فرسان" forKey:@"name"];

NSLog(@"data = %@",data);
NSLog(@"string = %@", [data objectForKey:@"name"]);

Вывод:

2012-01-18 14:17:42.498 Animal[62723:f803] {
    name = "\U0641\U0631\U0633\U0627\U0646";
}
2012-01-18 14:17:42.500 Animal[62723:f803] فرسان

Если вам не нравится, как NSDictionary реагирует на description, вам придется написать свой собственный метод для форматирования словаряв виде строки и используйте ее для входа в свой словарь.

Обновление

Я посмотрел исходный код, который вы разместили, который говорит с sqlite.Проблема в том, что вы превращаете массив значений ([TableProperties allValues]) в строку, используя спецификатор формата %@.Это отправляет метод description в NSArray, который возвращает строку.Так же, как NSDictionary, NSArray форматирует строку описания в «безопасном» формате, экранируя не-ASCII-символы, используя коды \U####.

Вам нужно написать собственный метод, который принимает массив и обращаетсяэто в строку и не не экранирует специальные символы.(Это должно быть в кавычках.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...