将希伯来语文本保存到NSUserDefaults会返回奇怪的编码

时间:2013-05-27 13:41:53

标签: ios objective-c encoding encode hebrew

我正在将希伯来语文本保存到NAMutableArray,然后我将其保存到NSUserDefalts,这样:

numOfWallPosts++;
        NSString *tempKeyToStore = [NSString stringWithFormat:@"wall_post_%d", numOfWallPosts]; // wall_post_%d

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

        [tempArray addObject:currentOwner];
        [tempArray addObject:currentTitle];
        [tempArray addObject:currentText];
        [tempArray addObject:currentDate];
        [tempArray addObject:currentTime];
        [tempArray addObject:currentImageURL];
        [tempArray addObject:currentWallID];


        [self.sharedPrefs setObject:tempArray forKey:tempKeyToStore];
        [self.sharedPrefs synchronize];

当我想要获得希伯来文本时,我得到这样的文字:

Wall messages: (
    "\U05de\U05e2\U05e8\U05db\U05ea",
    "\U05ea\U05e8\U05d2\U05d9\U05dc \U05e4\U05d9\U05e7\U05d5\U05d3 \U05d4\U05e2\U05d5\U05e8\U05e3",
    "\U05d0\U05d6\U05e2\U05e7\U05ea \U05ea\U05e8\U05d2\U05d5\U05dc \U05d1\U05e9\U05e2\U05d4 19:05",
    "27/05/13",
    "13:16",
    "http://blabla......",
    9
)

我尝试格式化UTF8StringNSUTF8StringEncoding中的文字,我仍然以这种方式获取文字。

我可以以正确的方式保存文本或将其编码回适当的希伯来语吗?

修改 这很奇怪,虽然文字保存奇怪,我把它拉回来,我得到了正确的文字。 但是当我将它们保存到NSUserDefaults时,它会向我显示这种奇怪的编码。

NSString *tempKeyToStore = [NSString stringWithFormat:@"wall_post_%d", indexPath.row];
    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    NSLog(@"\n\nWall messages: %@", [self.sharedPrefs objectForKey:tempKeyToStore]);

    tempArray = [self.sharedPrefs objectForKey:tempKeyToStore];
    NSString *tempOwner = [tempArray objectAtIndex:0];
    NSLog(@"\n\nOWNER: %@", tempOwner);

3 个答案:

答案 0 :(得分:1)

尝试做这样的事情:

NSString *someObject = //your object that needs decode
        NSString *decodedObject = [NSString
            stringWithCString:[someObject cStringUsingEncoding:NSUTF8StringEncoding]
            encoding:NSNonLossyASCIIStringEncoding];
        NSLog(@"decodedObject = %@", decodedObject);

编辑:您的代码可能在其他地方出现了问题,因为:

NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    [tempArray addObject:@"בדיקה"];

    [[NSUserDefaults standardUserDefaults] setObject:tempArray forKey:@"test"];
    [[NSUserDefaults standardUserDefaults] synchronize];    
    NSMutableArray *test2=[[NSUserDefaults standardUserDefaults] objectForKey:@"test"];    
    NSLog(@"test2: %@",[test2 objectAtIndex:0]);

工作正常。

答案 1 :(得分:1)

如果您使用NSLog(@"%@", ...)打印数组词典的说明,则使用\Unnnn转义打印所有非ASCII字符序列:

NSArray *a = [NSArray arrayWithObject:@"מערכת"];
NSLog(@"%@", a);

输出:

(
   "\U05de\U05e2\U05e8\U05db\U05ea"
)

(原因是descriptionNSArray的{​​{1}}方法 使用Old-Style ASCII Property Lists格式, 正如名称所示,它只允许使用ASCII字符。)

如果您打印字符串的说明,则会正确显示所有字符:

NSDictionary

输出:

מערכת

所以这只是一个显示问题。

答案 2 :(得分:0)

那么,您可以在sharedPrefs后面发布代码吗?

当我试图将一个简单的希伯来语保存到userdefault时,它运行得很好。

NSString *tempKeyToStore = @"KEY";

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

[tempArray addObject:@"שלום שלום"];

[[NSUserDefaults standardUserDefaults] setObject:tempArray forKey:tempKeyToStore];
[[NSUserDefaults standardUserDefaults] synchronize];

稍后阅读 -

//
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSMutableArray *tempArray = [defaults objectForKey:@"KEY"];

for (NSString* str in tempArray)
{
    NSLog(@"%@", str);
}

希望我帮助..