1

我正在使用 stringWithFormat @"%ls" 来做这件事,我只看到第一个字符被复制,这让我觉得它仍然假设它是一个单字节字符。

有任何想法吗?

4

4 回答 4

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

于 2010-04-09T21:16:11.800 回答
2

以下代码对我有用:

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

注意“%S”部分。这让一切变得不同了。

于 2011-10-08T12:42:16.617 回答
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 类别中。

于 2016-02-09T18:13:01.010 回答
-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
于 2011-01-19T15:05:59.307 回答