2017-02-21 166 views
0

我正在使用下面的代碼來存儲char *中的字符串數據。NSString 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); 
} 

,但仍然沒有!

+0

您是否嘗試過使用'characterAtIndex'? Objective-c爲大量這樣的函數提供了大量的函數,從而可以在大約一行代碼中完成整個事情。在iOS應用程序中使用這麼多舊的C,真是奇怪。 (不要誤會我的意思,我愛C) –

+0

是你的問題解決了嗎? – KrishnaCA

+0

@KrishnaCA我編輯了我的問題 – arniotaki

回答

1

首先,不保證任何NSString都可以表示爲C字符數組(所謂的C字符串)。原因是隻有一組有限的字符可用。你應該檢查字符串是否可以轉換(通過調用canBeConvertedToEncoding:)。

其次,使用mallocstrncpy函數時,它們依賴於C-字符串的長度,而不是在NSString的長度。所以,你應該首先從NSString的獲得C-字符串,然後把它的長度(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)。唯一重要的是你總是對'strlen','malloc'和'strncpy'函數使用返回的'const char *'來防止崩潰。 –

+0

NSUTF8StringEncoding解決了這個問題。謝謝! – arniotaki