【发布时间】:2011-02-06 08:10:50
【问题描述】:
我正在使用 stringWithFormat @"%ls" 来执行此操作,但我只看到第一个字符被复制,这让我觉得它仍然假设它是一个单字节字符。
有什么想法吗?
【问题讨论】:
我正在使用 stringWithFormat @"%ls" 来执行此操作,但我只看到第一个字符被复制,这让我觉得它仍然假设它是一个单字节字符。
有什么想法吗?
【问题讨论】:
使用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)。
【讨论】:
以下代码对我有用:
NSString *pStr = [NSString stringWithFormat:@"%S", GetTCHARString()];
注意“%S”部分。这完全不同。
【讨论】:
从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 类别中。
【讨论】:
为了解决这个任务,我这样做了:
@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
【讨论】: