NSString to char * with Greek characters

时间:2017-02-21 08:07:52

标签: ios objective-c c xcode encoding

我使用以下代码将字符串数据存储在char *。

 NSString *hotelName = [components[2] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
hotelInfo->hotelName = malloc(sizeof(char) * hotelName.length + 1);
strncpy(hotelInfo->hotelName, [hotelName UTF8String], hotelName.length + 1); 
NSLog(@"HOTEL NAME: %s",hotelInfo->hotelName);

问题在于奇怪印刷的希腊字符。我也尝试过使用其他编码(例如NSWindowsCP1253StringEncoding -it crashes-)

我甚至试过了:

hotelInfo->hotelName = (const char *)[hotelName cStringUsingEncoding:NSUnicodeStringEncoding]; 

但它也会产生奇怪的字符。

我想念什么?

修改 经过一些建议我尝试了以下内容:

if ([hotelName canBeConvertedToEncoding:NSWindowsCP1253StringEncoding]){
    const char *cHotelName = (const char *)[hotelName cStringUsingEncoding:NSWindowsCP1253StringEncoding];
    int bufSize = strlen(cHotelName) + 1;
    if (bufSize >0 ){
        hotelInfo->hotelName = malloc(sizeof(char) * bufSize);
        strncpy(hotelInfo->hotelName, [hotelName UTF8String], bufSize);
        NSLog(@"HOTEL NAME: %s",hotelInfo->hotelName);
    }
}else{
    NSLog(@"String cannot be encoded! Sorry! %@",hotelName);
    for (NSInteger charIdx=0; charIdx<hotelName.length; charIdx++){
        // Do something with character at index charIdx, for example:
        char x[hotelName.length];
        NSLog(@"%C", [hotelName characterAtIndex:charIdx]);
        x[charIdx] = [hotelName characterAtIndex:charIdx];
        NSLog(@"%s", x);
        if (charIdx == hotelName.length - 1)
            hotelInfo->hotelName = x;
    }
    NSLog(@"HOTEL NAME: %s",hotelInfo->hotelName);
}

但仍然没有!

1 个答案:

答案 0 :(得分:1)

首先,不能保证任何NSString都可以表示为C字符数组(所谓的 C-String )。原因是可用的字符集有限。您应该检查字符串是否可以转换(通过调用canBeConvertedToEncoding:)。

其次,在使用mallocstrncpy函数时,它们依赖于 C-String 的长度,而不是NSString的长度。所以你应该首先从NSString获取C-String,然后得到它的长度(strlen),并将此值用于函数调用:

const char *cHotelName = (const char *)[hotelName cStringUsingEncoding:NSWindowsCP1253StringEncoding];
int bufSize = strlen(cHotelName) + 1;
hotelInfo->hotelName = malloc(sizeof(char) * bufSize);
strncpy(hotelInfo->hotelName, cHotelName, bufSize);