0

这是我的代码。

std::wstring sourceString = L"test\n newline.";
NSString* transformedString = [NSString stringWithFormat:@"%S", sourceString.c_str()];

我希望两个字符串的内容相同,但transformedString 等效于@"t"。如何通过最少的编辑来解决这个问题?

(由于 unicode 问题,我必须使用 wstring。)

4

1 回答 1

1

在 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.)

于 2011-06-03T18:22:12.480 回答