Какие строки CFStringCreateWithFormat ожидает в качестве аргументов?

StackOverflow https://stackoverflow.com/questions/2027843

Вопрос

Приведенный ниже пример должен работать со строками в Юникоде, но это не так.


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 только из-за этой "системной кодировки". Пожалуйста, обратитесь к это подробное объяснение который я написал несколько лет назад, если вам интересно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top