stringWithFormat и проблема% S - PullRequest
0 голосов
/ 03 июня 2011

Вот мой код.

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

Я хотел, чтобы содержимое двух строк было одинаковым, но transformedString эквивалентно @ "t".Как я могу исправить это с минимальным редактированием?

(я должен использовать wstring из-за проблемы с юникодом.)

1 Ответ

1 голос
/ 03 июня 2011

В Mac OS X / iOS wchar_t имеет ширину 32 бита (т. Е. Представляет символы UTF-32, а не символы UTF-16.) %S соответствует массиву unichar с нулевым символом в конце и unichar имеет ширину 16 бит, а не 32 бита, поэтому символ 't' выглядит как NSString с завершающим нулевым символом (или начальным нулевым символом в целях с прямым порядком байтов), приводящим к обрезанию строки.

Чтобы преобразовать в NSString, попробуйте:

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

Обратите внимание, что вышеизложенное предполагает, что wchar_t содержит значение UTF-32, которое верно для Mac OS X и большинство (все?) *NIXes, но false в Windows (где wchar_t равно 16 битам, что эквивалентно unichar.)

...