Какие строки CFStringCreateWithFormat ожидает в качестве аргументов? - PullRequest
2 голосов
/ 08 января 2010

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


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.

Ответы [ 2 ]

4 голосов
/ 08 января 2010

Используйте %@, если хотите включить CFStringRef через CFStringCreateWithFormat.

См. раздел «Спецификаторы формата» в Руководстве по программированию строк для Core Foundation .

  • %@ для объектов Objective C, ИЛИ CFTypeRef объектов (CFStringRef совместим с CFTypeRef)
  • %s для массива 8-битных беззнаковых символов с нулевым символом в конце (то есть обычных строк C).
  • %S - для массива 16-битных символов Юникода с нулевым символом в конце.

Объект CFStringRef отличается от «массива 16-битных символов Юникода с нулевым символом в конце».

2 голосов
/ 09 января 2010

В качестве ответа на комментарий в другом ответе я бы порекомендовал постер к

  • генерирует строку UTF8 переносимым способом в char*
  • и в последнюю минуту преобразовать его в CFString, используя CFStringCreateWithCString с kCFStringEncodingUTF8 в качестве кодировки.

Пожалуйста, не используйте %s в CFStringCreateWithFormat. Пожалуйста, не полагайтесь на «системную кодировку», которая используется MacRoman в западноевропейских средах, но не на других языках. Концепция системного кодирования изначально неразумна, особенно в восточноазиатских средах (откуда я пришел), где даже символы внутри диапазона кода ASCII (ниже 127!) Модифицируются. Ад сломается, если вы полагаетесь на «системное кодирование». К счастью, начиная с 10.4, все методы, использующие «системное кодирование», теперь устарели, , кроме %s ....

Извините, я так много пишу для этой небольшой темы, но несколько лет назад было очень жаль, когда было много хороших приложений, которые не работали на японских / корейских компьютерах Mac только из-за этой "системной кодировки". " Пожалуйста, обратитесь к этому подробному объяснению , которое я написал несколько лет назад, если вам интересно.

...