Che tipo di corde fa CFStringCreateWithFormat aspetta come argomenti?
Domanda
L'esempio che segue dovrebbe funzionare con le stringhe Unicode, ma non è così.
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.
Soluzione
Usa %@
se si desidera includere un CFStringRef
tramite CFStringCreateWithFormat
.
Vedere la sezione di identificatori di formato di stringhe Guida alla programmazione per i core Fondazione .
-
%@
è per oggetti C obiettive o di oggettiCFTypeRef
(CFStringRef
è compatibile conCFTypeRef
) -
%s
è per una matrice con terminazione null di caratteri senza segno a 8 bit (cioè normali stringhe C). -
%S
è per un array terminazione Null di 16 bit caratteri Unicode.
Un oggetto CFStringRef non è lo stesso di “array terminazione Null di 16 bit caratteri Unicode”.
Altri suggerimenti
In risposta al commento in altra risposta, mi sento di raccomandare il poster a
- generare una stringa UTF8 in un modo portabile in
char*
- e, all'ultimo minuto, convertirlo in
CFString
usandoCFStringCreateWithCString
conkCFStringEncodingUTF8
come la codifica.
Si prega, si prega di non utilizzare in %s
CFStringCreateWithFormat
. Si prega di non fare affidamento sulla "codifica di sistema", che è MacRoman sugli ambienti dell'Europa occidentale, ma non in altre lingue. Il concetto del sistema di codifica è intrinsecamente morte cerebrale, soprattutto in ambienti dell'Asia orientale (che mi è venuto da) dove anche i personaggi all'interno gamma codice ASCII (sotto 127!) Viene modificato. L'inferno si scatena se si basano su "encoding di sistema". Fortunatamente, visto 10.4, tutti i metodi che usano "sistema di codifica" sono ora deprecato, tranne %s
....
Mi dispiace che scrivo così tanto per questo piccolo argomento, ma è stato un vero peccato a pochi anni fa, quando c'erano molte applicazioni piacevoli che non hanno funzionato su Mac / Giapponese Coreano a causa del proprio questa "encoding sistema. " Si prega di fare riferimento a questa spiegazione dettagliata che ho scritto qualche anno fa, se siete interessati.