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.
¿Fue útil?

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 objetos CFTypeRef (CFStringRef es compatible con CFTypeRef)
  • %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 usando CFStringCreateWithCString con kCFStringEncodingUTF8 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top