2010-04-09 4 views

Répondre

5

Utilisez initWithBytes:length:encoding. Vous devrez connaître l'encodage que wchar_t utilise, je crois que c'est UTF-32 sur les plates-formes Apple.

#if defined(__BIG_ENDIAN__) 
# define WCHAR_ENCODING NSUTF32BigEndianStringEncoding 
#elif defined(__LITTLE_ENDIAN__) 
# define WCHAR_ENCODING NSUTF32LittleEndianStringEncoding 
#endif 

[[NSString alloc] initWithBytes:mystring 
    length:(mylength * 4) encoding:WCHAR_ENCODING] 

En général, je suggère éviter d'utiliser wchar_t si possible, car il est pas très portable. En particulier, comment êtes-vous censé comprendre quel encodage il utilise? (Sous Windows c'est UTF-16LE ou UTF-16BE, sur OS X, Linux et iOS c'est UTF-32LE ou UTF-32BE).

-1

Pour résoudre cette tâche, je fait cela:

@interface NSString (WCarToString) 
- (NSString*) getStringFromWChar:(const wchar_t*) inStr; 
@end 

////////////////////////// 

@implementation NSString (WCarToString) 

- (NSString*) getStringFromWChar:(const wchar_t*) inStr 
{ 
char* str = new char[wcslen(inStr)+1];  
wcstombs(str, inStr, wcslen(inStr)+1); 
NSString* wNSString = [NSString stringWithCString:str encoding:NSUTF8StringEncoding]; 
delete [] str; 
return wNSString; 
} 

@end 
+0

Cela semble un peu exagéré quand on peut juste [NSString initWithBytes] –

2

code suivant a fonctionné pour moi:

NSString *pStr = [NSString stringWithFormat:@"%S", GetTCHARString()]; 

Notez la partie "% S". Cela a fait toute la différence.

+0

Beaucoup de recherches me mènent ici. donc mise à jour avec une réponse. – moonlightdock

0

De l'Foundation Constants Reference, je pense que la fonction NSHostByteOrder() est la bonne façon:

@import Foundation; 

NSString * WCHARToString(wchar* wcharIn){ 
    if (NSHostByteOrder() == NS_LittleEndian){ 
     return [NSString stringWithCString: (char *)wcharIn encoding:NSUTF32LittleEndianStringEncoding]; 
    } 
    else{ 
     return [NSString stringWithCString: (char *)wcharIn encoding:NSUTF32BigEndianStringEncoding]; 
    } 
} 
wchar_t * StringToWCHAR(NSString* stringIn) 
{ 
    if (NSHostByteOrder() == NS_LittleEndian){ 
     return (wchar_t *)[stringIn cStringUsingEncoding:NSUTF32LittleEndianStringEncoding]; 
    } 
    else{ 
     return (wchar_t *)[stringIn cStringUsingEncoding:NSUTF32BigEndianStringEncoding]; 
    } 
} 

Probablement mieux pour les mettre dans une catégorie NSString.