gpt4 book ai didi

iphone - NSMutableArray 或 NSMutableDictionary 中的阿拉伯字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:20:12 25 4
gpt4 key购买 nike

我在向 NSMutableArrayNSMutableDictionary 添加阿拉伯字符串时遇到问题。

例子:

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;

最佳答案

当您使用 %@ 记录对象时,NSLog 会向对象发送 description 消息并打印结果字符串。

NSDictionary 通过以“安全”格式编码其键和值来响应 description 消息,使用 \U## 转义非 ASCII 字符## 代码。

如果您将阿拉伯字符串直接传递给 NSLog,它只会打印不带转义码的字符串:

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 以“安全”格式格式化描述字符串,使用 \U#### 代码转义非 ASCII 字符.

您需要编写自己的方法来获取数组并将其转换为字符串并且不会对特殊字符进行转义。 (不过它需要转义引号。)

关于iphone - NSMutableArray 或 NSMutableDictionary 中的阿拉伯字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8916635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com