Al usar printf para dar formato a una cadena de doble byte en una cadena de un solo byte:¿Por qué printf no formatea los parámetros unicode?
printf("%ls\n", L"s:\\яшертыHello"); // %ls for a wide string (%s varies meaning depending on the project's unicode settings).
Claramente, algunos caracteres no pueden representarse como caracteres ASCII, el comportamiento así que a veces he visto que los caracteres de doble byte convertirse en un '?' marca el personaje Pero, esto parece depender de los personajes particulares. Para el printf anteriormente, la salida es:
s:\
Tenía la esperanza de que podría conseguir algo como:
s:\??????Hello
Me temo que he perdido el ejemplo, pero creo que para una cadena cuando encontró caracteres unicode, reemplazó el primero con un '?' y luego desistió del resto.
Por lo tanto, mi pregunta es, ¿qué se supone que ocurre al formatear una cadena ancha en una cadena de un solo byte. Documentación aquí: http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx dice "Los caracteres se muestran hasta el primer carácter nulo". Pero, no estoy viendo eso. ¿Es esto un error en printf, o es el comportamiento que estoy viendo documentado en alguna parte? Si es así, dónde.
Gracias por su ayuda.
ACTUALIZACIÓN
Gracias por las respuestas de las personas que me dan alternativas al uso de printf. Voy a cambiar a una alternativa, pero estoy realmente interesado por curiosidad, ¿por qué printf no tiene un comportamiento documentado confiable? Parece como si el implementador de la misma hubiera salido de su camino para que esto no funcionara.
¿Ha probado "% S" como el especificador de formato en lugar de "% ls"? –
sí. Creo que% S y% ls tienen el mismo significado si su proyecto no tiene UNICODE definido. –
Lectura de las especificaciones de formato (que acepto no son claras). S es para una cadena ancha cuando la configuración de su proyecto no tiene definido UNICODE, S es para una cadena de un solo byte cuando tiene definido UNICODE. % ls es para una cadena ancha independientemente de si está compilando o no para UNICODE o no. % s también varía el significado,% hs siempre es para cadenas de un solo byte. –