Que tipo de cordas que CFStringCreateWithFormat espera como argumentos?
Pergunta
O exemplo abaixo deve trabalhar com cadeias de caracteres Unicode, mas isso não acontece.
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.
Solução
Use %@
se você quiser incluir um CFStringRef
via CFStringCreateWithFormat
.
Veja seção o formato especificadores de Cordas Guia de Programação para o Núcleo Fundação .
-
%@
é para objectos c objectiva, ou objectosCFTypeRef
(CFStringRef
é compatível comCFTypeRef
) -
%s
é para uma matriz de terminada com nulo de caracteres sem sinal de 8 bits (isto é, cordas normais C). -
%S
é para uma matriz de terminada com nulo de caracteres Unicode de 16 bits.
Um CFStringRef objecto não é o mesmo que “uma matriz terminada com nulo de caracteres Unicode 16 bits”.
Outras dicas
Como uma resposta ao comentário na outra resposta, eu recomendaria o cartaz para
- gerar uma string UTF8 de uma forma portátil em
char*
- e, no último minuto, convertê-lo para
CFString
usandoCFStringCreateWithCString
comkCFStringEncodingUTF8
como a codificação.
Por favor, por favor, não use %s
em CFStringCreateWithFormat
. Por favor, não contam com o "sistema de codificação", que é MacRoman em ambientes da Europa Ocidental, mas não em outros idiomas. O conceito de sistema de codificação é inerentemente com morte cerebral, especialmente em ambientes Asiático (que eu vim), onde até mesmo os personagens dentro de intervalo de código ASCII (abaixo 127!) É modificado. o inferno quebra frouxamente se você confiar em "sistema de codificação". Felizmente, uma vez que 10,4, todos os métodos que usam "encoding sistema" estão agora obsoleta, , exceto %s
....
Me desculpe, eu escrevo isto muito por este pequeno tema, mas foi uma pena de alguns anos atrás, quando havia muitos aplicativos agradáveis ??que não funcionou no japonesas / Macs coreano por causa de apenas isso "encoding sistema. " Por favor, consulte este explicação detalhada que escrevi há alguns anos, Se você estiver interessado.