开发者

stringWithFormat and %S problem

Here is my code.

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

I intended two strings' contents to be same but transformedString is equiva开发者_StackOverflow中文版lent to @"t". How can I fix this with minimal edit?

(I have to use wstring because of unicode issue.)


On Mac OS X/iOS, wchar_t is 32 bits wide (i.e. it represents UTF-32 characters, not UTF-16 characters.) %S corresponds to a null-terminated unichar array, and unichar is 16 bits wide, not 32 bits wide, so the character 't' appears to NSString to have a trailing null character (or leading null character on Big Endian targets) causing the string to be truncated.

To convert to an NSString, try:

NSString * transformedString = [[NSString alloc]
    initWithBytes: sourceString.c_str()
    length:        sourceString.size() * sizeof(wchar_t)
    encoding:      NSUTF32StringEncoding];

Note that the above assumes that wchar_t holds a UTF-32 value, which is true on Mac OS X and most (all?) *NIXes, but false on Windows (where wchar_t is 16 bits, equivalent to unichar.)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜