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.
È stato utile?

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 oggetti CFTypeRef (CFStringRef è compatibile con CFTypeRef)
  • %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 usando CFStringCreateWithCString con kCFStringEncodingUTF8 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top