2017-02-21 49 views
0

Я использую следующий код для хранения данных строки в char *.NSString to 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 -это crashes-)

Я пытался даже что:

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

, но она также производит странные символы.

Что мне не хватает?

EDIT: После нескольких предложений, которые я попробовал следующая:

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

Но еще ничего!

+0

Вы пробовали использовать 'characterAtIndex'? Objective-c имеет массу встроенных функций для этого, вплоть до того, что все это можно сделать примерно в одной строке кода. Странно видеть, как много старых C используется в приложении iOS haha. (Не поймите меня неправильно, я люблю C) –

+0

ваша проблема решена? – KrishnaCA

+0

@KrishnaCA Я отредактировал мой вопрос – arniotaki

ответ

1

Прежде всего, не гарантируется, что любой NSString может быть представлен как массив символов C (так называемый C-String). Причина в том, что имеется только ограниченный набор доступных символов. Вы должны проверить, может ли строка быть преобразована (путем вызова canBeConvertedToEncoding:).

Во-вторых, при использовании malloc и strncpy функции, они полагаются на длину C-String, а не на длине NSString. Таким образом, вы должны сначала получить C-String из NSString, а затем получить его длина (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); 
+0

Кажется, что это работает для большинства персонажей, но не для политоники или тех, у кого есть апострофы. Конечно, всегда лучше, чем ничего – arniotaki

+0

В этом случае вы можете попробовать разные кодировки (например, Unicode). Единственное значение имеет то, что вы всегда используете возвращаемый 'const char *' для функций 'strlen',' malloc' и 'strncpy' для предотвращения сбоев. –

+0

NSUTF8StringEncoding решает проблему. Благодаря! – arniotaki