这是我的代码。
std::wstring sourceString = L"test\n newline.";
NSString* transformedString = [NSString stringWithFormat:@"%S", sourceString.c_str()];
我希望两个字符串的内容相同,但transformedString 等效于@"t"。如何通过最少的编辑来解决这个问题?
(由于 unicode 问题,我必须使用 wstring。)
这是我的代码。
std::wstring sourceString = L"test\n newline.";
NSString* transformedString = [NSString stringWithFormat:@"%S", sourceString.c_str()];
我希望两个字符串的内容相同,但transformedString 等效于@"t"。如何通过最少的编辑来解决这个问题?
(由于 unicode 问题,我必须使用 wstring。)
在 Mac OS X/iOS 上,wchar_t
是 32 位宽(即它表示 UTF-32 字符,而不是 UTF-16 字符。)%S
对应一个以空字符结尾的unichar
数组,并且unichar
是 16 位宽,而不是 32 位宽,所以字符't'
出现toNSString
有一个尾随空字符(或 Big Endian 目标上的前导空字符)导致字符串被截断。
要转换为NSString
,请尝试:
NSString * transformedString = [[NSString alloc]
initWithBytes: sourceString.c_str()
length: sourceString.size() * sizeof(wchar_t)
encoding: NSUTF32StringEncoding];
请注意,上面假设它wchar_t
包含一个 UTF-32 值,这在 Mac OS X 和大多数(全部?)*NIX 上为真,但在 Windows 上wchar_t
为假(其中 16 位,相当于unichar
.)