2012-03-29 12 views

Respuesta

8

La forma portátil de hacerlo sería utilizar una biblioteca consciente de Unicode como ICU. Parece que u_strToUpper podría ser la función que estás buscando.

+3

Como nota, la ICU requerirá que convierta UTF-8 -> UTF-16 -> mayúscula UTF-16 -> mayúscula UTF-8. (En realidad, no hay otras bibliotecas que hagan esto). –

0

La manera canónica de hacerlo es con wchar_t, si tiene una cadena de caracteres anchos y usa towlower/towupper/towctrans con sus caracteres anchos (lo cual funcionará si su configuración regional está configurada correctamente). Así que debes tomar tu cadena UTF-8, convertirla en una cadena de caracteres anchos, y luego usar estas funciones que toman wchar_t's y luego convertir de nuevo.

Este es un PITA gigante, por lo que probablemente sea mejor utilizar una biblioteca Unicode de código abierto compatible como ICU.

+1

No, esto es incorrecto. Es imposible hacer que funcione con texto en alemán (por ejemplo), porque la versión en mayúscula de ß es SS, que son dos caracteres. Esto está lejos del único ejemplo en el que se rompe, pero es el más común. –

+0

Es cierto, pero es la única versión que está cerca de ser correcta usando librerías posix-standard (más yo culpo al estándar Unicode que inicialmente especificaba una mapeo de casos 1: 1 entre caracteres). –

+0

@JacobB La carcasa completa ofrece resultados mucho mejores que la carcasa simple simple y antigua, y lo sabemos desde hace muchos años. Es por eso que los lenguajes como Java y Perl ofrecen una carcasa completa en sus funciones de mapeo de cassettes. No trabaje codepoint por punto de código; simplemente no funciona. Necesitas toda la cadena. – tchrist

8

glib tiene g_utf8_strup().

+1

Estoy seguro de que esta es la respuesta correcta, pero por alguna razón, obtengo 'Sin entrada manual para g_utf8_strup' al ejecutar' man g_utf8_strup', esto a pesar de que ejecuta 'nm /opt/local/lib/libglib-2.0.a | grep g_utf8_strup' demuestra que está allí. Eso es realmente superstupido. FTFSF. – tchrist

+1

@tchrist: estúpido es relativo; una página de manual para cada función glib resultaría en 100 + MB de páginas de manual –

+0

@ IgnacioVazquez-Abrams: viendo cómo pesa la versión ** HTML sin comprimir a 75 MB, no confío demasiado en su estimación. – ninjalj

Cuestiones relacionadas