what old kpop korean english bands all c++

c++ - old - Convierta wchar_t en char



kpop wikipedia (7)

¿Por qué no utilizar una rutina de biblioteca de wcstombs ?

Me preguntaba si es seguro hacerlo.

wchar_t wide = /* something */; assert(wide >= 0 && wide < 256 &&); char myChar = static_cast<char>(wide);

Si estoy seguro de que el parche ancho estará dentro del rango ASCII.


En general, no. int(wchar_t(255)) == int(char(255)) por supuesto, pero eso solo significa que tienen el mismo valor int. No pueden representar los mismos personajes.

Vería tal discrepancia en la mayoría de las PC con Windows, incluso. Por ejemplo, en la página de códigos de Windows 1250, char(0xFF) es el mismo carácter que wchar_t(0x02D9) (punto arriba), no wchar_t(0x00FF) (pequeño y con diéresis).

Tenga en cuenta que ni siquiera se mantiene para el rango ASCII, ya que C ++ ni siquiera requiere ASCII. En los sistemas IBM en particular, puede ver que ''A'' != 65


Está buscando wctomb() : está en el estándar ANSI, por lo que puede contar con él. Funciona incluso cuando el wchar_t usa un código superior a 255. Es casi seguro que no desea usarlo.

wchar_t es un tipo integral, por lo que su compilador no se quejará si realmente lo hace:

char x = (char)wc;

pero debido a que es un tipo integral, no hay absolutamente ninguna razón para hacer esto. Si accidentalmente lees C: The Complete Reference de Herbert Schildt , o cualquier libro en C basado en él, entonces estás completa y totalmente mal informado. Los caracteres deben ser de tipo int o mejor . Eso significa que deberías escribir esto:

int x = getchar();

y no esto:

char x = getchar(); /* <- WRONG! */

En cuanto a los tipos integrales, char es inútil. No debe hacer funciones que tomen parámetros de tipo char , y no debería crear variables temporales de tipo char , y el mismo consejo vale para wchar_t también.

char* puede ser un typedef conveniente para una cadena de caracteres, pero es un error de principiante pensar en esto como una "matriz de caracteres" o un "puntero a una matriz de caracteres", a pesar de lo que dice la herramienta cdecl . Tratarlo como una matriz real de personajes con tonterías como esta:

for(int i = 0; s[i]; ++i) { wchar_t wc = s[i]; char c = doit(wc); out[i] = c; }

es absurdamente incorrecto No hará lo que quieras; se romperá de maneras sutiles y serias, se comportará de manera diferente en diferentes plataformas y seguramente confundirá a sus usuarios. Si ve esto, está tratando de wcstombs a wcstombs que ya forma parte de ANSI C, pero sigue siendo incorrecto .

Realmente está buscando iconv() , que convierte una cadena de caracteres de una codificación (incluso si está empaquetada en una matriz wchar_t ) en una cadena de caracteres de otra codificación.

Ahora ve a leer this , para aprender lo que está mal con iconv.


Técnicamente, '' char '' podría tener el mismo rango que '' signed char '' o '' unsigned char ''. Para los caracteres sin firmar, su rango es correcto; teóricamente, para los caracteres con signo, su condición es incorrecta. En la práctica, muy pocos compiladores se opondrán, y el resultado será el mismo.

Nitpick: el último && en la assert es un error de sintaxis.

Si la afirmación es adecuada depende de si puede permitirse el colapso cuando el código llega al cliente, y lo que podría o debería hacer si se viola la condición de aserción, pero la aserción no se compila en el código. Para el trabajo de depuración, parece correcto, pero es posible que también desee una prueba activa para comprobar el tiempo de ejecución.


Una breve función que escribí hace un tiempo para empaquetar una matriz wchar_t en una matriz de caracteres. Los caracteres que no están en la página de códigos ANSI (0-127) se reemplazan por ''?'' personajes, y maneja parejas sustitutas correctamente.

size_t to_narrow(const wchar_t * src, char * dest, size_t dest_len){ size_t i; wchar_t code; i = 0; while (src[i] != ''/0'' && i < (dest_len - 1)){ code = src[i]; if (code < 128) dest[i] = char(code); else{ dest[i] = ''?''; if (code >= 0xD800 && code <= 0xD8FF) // lead surrogate, skip the next code unit, which is the trail i++; } i++; } dest[i] = ''/0''; return i - 1; }


uno también podría convertir wchar_t -> wstring -> string -> char

wchar_t wide; wstring wstrValue; wstrValue[0] = wide string strValue; strValue.assign(wstrValue.begin(), wstrValue.end()); // convert wstring to string char char_value = strValue[0];


assert es para garantizar que algo sea cierto en un modo de depuración, sin que tenga ningún efecto en una versión de lanzamiento. Es mejor utilizar una declaración if y tener un plan alternativo para los caracteres que están fuera del rango, a menos que la única forma de obtener caracteres fuera del rango sea a través de una falla del programa.

Además, dependiendo de la codificación de su carácter, puede encontrar una diferencia entre los caracteres Unicode 0x80 a 0xff y su versión char .