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