Как скопировать wchar_t в NSString? - PullRequest
1 голос
/ 10 апреля 2010

Я использую stringWithFormat @ "% ls", чтобы сделать это, и я вижу только первый скопированный символ, который заставляет меня думать, что он все еще предполагает, что это однобайтовый символ.

Есть идеи?

Ответы [ 4 ]

5 голосов
/ 10 апреля 2010

Используйте initWithBytes:length:encoding. Вам нужно знать кодировку, используемую wchar_t, я думаю, что это UTF-32 на платформах 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]

В общем, я рекомендую избегать использования wchar_t, если это вообще возможно, потому что он не очень переносим. В частности, как вы должны выяснить, какую кодировку он использует? (В Windows это UTF-16LE или UTF-16BE, в OS X, Linux и iOS это UTF-32LE или UTF-32BE).

2 голосов
/ 08 октября 2011

Следующий код работал для меня:

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

Обратите внимание на часть "% S". В этом вся разница.

0 голосов
/ 09 февраля 2016

Из справочника Foundation я думаю, что функция NSHostByteOrder() - правильный путь:

@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];
    }
}

Вероятно, лучше всего поместить их в категорию NSString.

0 голосов
/ 19 января 2011

Для решения этой задачи я сделал это:

@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
...