¿Qué tipo de cuerdas qué CFStringCreateWithFormat espera como argumentos?
Pregunta
El siguiente ejemplo debe trabajar con cadenas Unicode pero no lo hace.
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.
Solución
Uso %@
si desea incluir una CFStringRef
través CFStringCreateWithFormat
.
Consulte la sección especificadores de formato de cadenas Guía de programación de la Fundación núcleo .
-
%@
es para objetos Objective C, u objetosCFTypeRef
(CFStringRef
es compatible conCFTypeRef
) -
%s
es para una matriz terminada en nulo de caracteres sin signo de 8 bits (es decir, cadenas normales C). -
%S
es para una matriz terminada en nulo de caracteres Unicode de 16 bits.
Un objeto CFStringRef no es lo mismo que “una matriz terminada en nulo de caracteres Unicode de 16 bits”.
Otros consejos
Como respuesta a la observación de la otra respuesta, recomendaría el cartel a
- generar una cadena UTF8 de una manera portátil en
char*
- y, en el último minuto, convertirlo a
CFString
usandoCFStringCreateWithCString
conkCFStringEncodingUTF8
como la codificación.
Por favor, por favor no utilice %s
en CFStringCreateWithFormat
. Por favor, no se basan en el "sistema de codificación", que es MacRoman en entornos de Europa Occidental, pero no en otros idiomas. El concepto de la codificación del sistema es intrínsecamente con muerte cerebral, especialmente en entornos de Asia oriental (que viene) cuando cambien incluso los caracteres dentro de un rango de códigos ASCII (por debajo de 127!). El infierno se desata si se basan en "codificación del sistema". Afortunadamente, desde 10.4, todos los métodos que utilizan "sistema de codificación" se considera obsoleto, excepto %s
....
Lo siento que escribo esta cantidad por este pequeño tema, pero fue una verdadera lástima hace unos años, cuando había muchas aplicaciones agradables que no trabajan en los Macs coreanos / japoneses debido precisamente esta "sistema de codificación. " Por favor, consulte esta explicación detallada que escribí hace unos años, si está interesado.