如何将wchar_t复制到NSString中?

时间:2010-04-09 20:58:19

标签: iphone nsstring wchar-t

我正在使用stringWithFormat @“%ls”来执行此操作,我只看到复制的第一个字符,这让我觉得它仍然假设它是一个单字节字符。

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

使用initWithBytes:length:encoding。您必须知道wchar_t使用的编码,我相信它在Apple平台上是UTF-32。

#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)。

答案 1 :(得分:2)

以下代码为我工作:

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

注意“%S”部分。这完全不同。

答案 2 :(得分:0)

Foundation Constants Reference开始,我认为函数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类别中。

答案 3 :(得分:-1)

为了解决这个问题,我做了这个:

@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