J'utilise stringWithFormat @ "% ls" pour le faire et je ne vois que le premier caractère copié, ce qui me fait penser qu'il s'agit toujours d'un caractère à un seul octet.Comment copier un wchar_t dans un NSString?
Des idées?
J'utilise stringWithFormat @ "% ls" pour le faire et je ne vois que le premier caractère copié, ce qui me fait penser qu'il s'agit toujours d'un caractère à un seul octet.Comment copier un wchar_t dans un NSString?
Des idées?
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).
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
code suivant a fonctionné pour moi:
NSString *pStr = [NSString stringWithFormat:@"%S", GetTCHARString()];
Notez la partie "% S". Cela a fait toute la différence.
Beaucoup de recherches me mènent ici. donc mise à jour avec une réponse. – moonlightdock
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.
Cela semble un peu exagéré quand on peut juste [NSString initWithBytes] –