¿Qué puedo hacer para solucionar esto? ¿Tengo para hacer muchas codificaciones manuales adicionales de ? De la forma en que lo entiendo, std :: string no se preocupa por la codificación , solo los bytes, así que cuando I le pasa una cadena Unicode y lo escribe en el archivo, seguramente ese archivo debe contener los mismos bytes y ser reconocido como un archivo codificado UTF-8?
Tiene la razón que std::string
está codificando agnóstico. Simplemente tiene una matriz de elementos char
. La forma en que se interpretan estos elementos char
como texto depende del entorno. Si su configuración regional no está configurada en alguna forma de Unicode (es decir, UTF-8 o UTF-16), cuando imprima una cadena, no se mostrará/interpretará como Unicode.
¿Seguro de su cadena literal "abcdefgàèíüŷÀ" es en realidad Unicode y no, por ejemplo, Latin-1? (ISO-8859-1 o posible Windows-1252)? Debe determinar en qué configuración regional está configurada su plataforma actualmente.
----------- ----------- EDITAR
Creo que sé su problema: algunos de esos caracteres Unicode en la cadena literal charset
, como el carácter acentuado "À", son caracteres de dos bytes (suponiendo una codificación UTF-8). Cuando direcciona la cadena del juego de caracteres utilizando el operador []
en su función random_string
, está devolviendo la mitad de un carácter Unicode. Por lo tanto, la función random-string
crea una cadena de caracteres no válida.
Por ejemplo, considere el siguiente código:
std::string s = "À";
std::cout << s.length() << std::endl;
En un entorno donde la cadena literal se interpreta como UTF-8, este programa es la salida 2
. Por lo tanto, el primer carácter de la cadena (s[0]
) es solo medio de un carácter Unicode y, por lo tanto, no es válido. Como su función random_string
está direccionando la cadena en bytes individuales usando el operador []
, está creando cadenas aleatorias no válidas.
Así que sí, necesita usar std::wstring
, y cree su serie de caracteres-literal usando el prefijo L
.
¿Está buscando en std :: wstring? – Chubsdad
Solo una suposición descabellada: ¿podría ser que su función 'random_string' está insertando accidentalmente valores nulos debido a un error de uno por uno con la cadena de caracteres? –
@Charles: Eso sería como yo :) Pero lo dudo, ya que el constructor std :: string descarta el nulo del literal de la cadena, y la función random_string simplemente selecciona un carácter aleatorio de la cadena de caracteres. – Oystein