【问题标题】:Saving Hebrew text to NSUserDefaults return strange encoding将希伯来文本保存到 NSUserDefaults 会返回奇怪的编码
【发布时间】:2023-04-08 13:21:01
【问题描述】:

我将希伯来文本保存到 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);

【问题讨论】:

    标签: ios objective-c encoding encode hebrew


    【解决方案1】:

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

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

    输出:

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

    (原因是NSArrayNSDictionarydescription方法 使用Old-Style ASCII Property Lists 格式, 顾名思义,它只允许使用 ASCII 字符。)

    如果你打印一个字符串的描述,所有的字符都会正确显示:

    NSLog(@"%@", [a objectAtIndex:0]);
    

    输出:

    מערכת

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

    【讨论】:

    • 如果我想在 nslog 中正确显示文本,我需要将文本编码为 ascii?
    • @IdanMoshe:我会使用一个循环来 NSLog 数组中的所有条目。
    【解决方案2】:

    尝试做这样的事情:

    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]);
    

    工作正常。

    【讨论】:

    • 您不需要在字符串中写入 unicode。它应该类似于NSString *someObject = object; 我已经编辑了上面的解决方案。
    • 我搜索了几个小时以找到将编码从 \U660 转换回 ♠ 的方法。最后,这提供了我需要的洞察力。谢谢!
    【解决方案3】:

    嗯,你能把 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);
    }
    

    希望我有所帮助..

    【讨论】:

    • 我认为这只是打印问题。与 nsuserdefaults 无关。
    • 尝试打印一个简单的数组,它的作用是一样的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2012-05-06
    相关资源
    最近更新 更多