使用UTF-8时NSString包含错误的字符

时间:2012-06-06 12:37:22

标签: objective-c ios encoding utf-8 nsstring

我从UTF-8编码的XML文件中获取数据,我想在UITableView中显示每个元素。 我希望我的单元格具有相同的大小,并显示尽可能多的数据的2个第一个文本行,所以我尝试删除回车。

在我的cellForRow方法中,我改变了这个:

[[myCell textLabel] setText:data];

通过:

[[myCell textLabel] setText:[self correctData:data]];

这是我的correctData方法:

- (NSString *) correctData : (NSString *) str
{
    NSMutableString *res = [NSMutableString stringWithFormat:@""];
    for(int i = 0 ; i < [str length] ; i++)
    {
        char car = [str characterAtIndex:i];
        if(car != 10 && car != 13) 
           [res appendString:[NSString stringWithFormat:@"%c",car]];
    }
    return res;
}

这正确地删除了回车符,但它也改变了UTF-8字符。例如,初始字符串(str)的一小部分:

  

Diplômé(e)d'Etat

使用此功能,它变为:

  

DiplÙmÈ(e)d'Etat

我该怎么办?感谢。

1 个答案:

答案 0 :(得分:4)

NSString适用于存储在16位的unichar个字符,而char只有8位长。将unichar转换为char会改变代码点高于U+00FF的所有字符。

您可以将char替换为unichar,将%c替换为%C来解决此问题。

编辑:但这并不是很有效率。您最好使用正则表达式替换所有换行符:

str = [str stringByReplacingOccurrencesOfString:@"[\r\n]+"
                                     withString:@""
                                        options:NSRegularExpressionSearch
                                           range:NSMakeRange(0, str.length)];