Какие строки CFStringCreateWithFormat ожидает в качестве аргументов?
Вопрос
Приведенный ниже пример должен работать со строками в Юникоде, но это не так.
CFStringRef aString = CFSTR("one"); // in real life this is an Unicode string
CFStringRef formatString = CFSTR("This is %s example"); // also tried %S but without success
CFStringRef resultString = CFStringCreateWithFormat(NULL, NULL, formatString, aString);
// Here I should have a valid sentence in resultString but the current result is like aString would contain garbage.
Решение
Использование %@
если вы хотите включить CFStringRef
через CFStringCreateWithFormat
.
Видишь раздел "Спецификаторы формата" Руководства по программированию строк для Core Foundation.
%@
предназначен для объектов Objective C, ИЛИCFTypeRef
объекты (CFStringRef
совместим сCFTypeRef
)%s
является для завершающегося нулем массива 8-разрядных символов без знака (т.е.обычные строки на языке Си).%S
предназначен для массива 16-разрядных символов Юникода с нулевым завершением.
Объект CFStringRef - это не то же самое, что “массив 16-разрядных символов Юникода с нулевым завершением”.
Другие советы
В качестве ответа на комментарий в другом ответе я бы порекомендовал плакат для
- сгенерируйте строку UTF8 переносимым способом в
char*
- и, в последнюю минуту, преобразуйте его в
CFString
используяCFStringCreateWithCString
сkCFStringEncodingUTF8
как кодировка.
Пожалуйста, пожалуйста, не используйте %s
в CFStringCreateWithFormat
.Пожалуйста, не полагайтесь на "системную кодировку", которая используется MacRoman в западноевропейских средах, но не на других языках.Концепция системного кодирования по своей сути является безмозглой, особенно в условиях Восточной Азии (откуда я родом), где изменены даже символы внутри диапазона кодов ASCII (ниже 127!).Ад вырвется на свободу, если вы будете полагаться на "системное кодирование".К счастью, начиная с версии 10.4, все методы, использующие "системное кодирование", теперь устарели, за исключением %s
... .
Мне жаль, что я пишу так много для этой небольшой темы, но было очень жаль, что несколько лет назад было много хороших приложений, которые не работали на японских / корейских компьютерах Mac только из-за этой "системной кодировки". Пожалуйста, обратитесь к это подробное объяснение который я написал несколько лет назад, если вам интересно.