estoy trabajando en un escáner léxico codificado a mano rudimentario y deseen apoyar UTF-8 de entrada (que no es más 1970!). los caracteres de entrada se leen de stdin
o un archivo de uno en uno y empujaron en un búfer hasta que se vea un espacio en blanco, etc. pensé en escribir mi propia envoltura para fgetc()
que en vez volver char[]
de bytes que componen el conjunto de caracteres UTF-8 y trabajar con el resultado como una cuerda ... sería bastante fácil, pero se convertiría en una pendiente resbaladiza. Preferiría no perder el tiempo reinventando la rueda y en su lugar usar una biblioteca existente y probada como ICU. Y así que ahora tengo un código de apoyo no UTF-8 que funciona con fgetc()
, isspace()
, strcmp()
, etc., que estoy tratando de actualizar a utilizar en la UCI. Esta es mi primera incursión en la unidad de cuidados intensivos y he estado leyendo la documentación y tratando de encontrar ejemplos de uso con la búsqueda de códigos de Google, pero todavía hay algunos puntos de confusión que espero que alguien pueda aclarar.Preguntas al actualizar un código escáner para utilizar UCI
La función devuelve u_fgetc()
UChar
y u_fgetcx()
vuelve UChar32
... la documentación recomienda utilizar u_fgetcx()
puntos de código para leer, así que eso es lo que estoy empezando. Me quedo con el mismo método que el anterior, pero estoy empujando UChar32
s en un búfer en lugar de char
s.
¿Cuál es la forma correcta de comparar un personaje con un valor conocido? Originalmente pude hacer
if (c == '+')
para verificar si el signo más fue extraído de la entrada. GCC no se queja cuandoc
es unaUChar32
(que es entonces una comparación entreUChar32
ychar
), pero ¿es realmente adecuado?Pude usar
strcmp()
para comparar los caracteres almacenados en el búfer con un valor conocido, por ejemploif ((strcmp(buf, "else") == 0)
. Hayu_strcmp()
proporcionada por la UCI y yo creo que puede que tenga que utilizar losU_STRING_DECL
yU_STRING_INIT
macros para especificar el conocido literal, pero no estoy seguro. La documentación muestra que resultan enUChar[]
, aunque supongo que necesitoUChar32[]
... y estoy seguro de cómo usarlos correctamente todos modos. Cualquier orientación aquí sería bienvenida.Después de leer una serie de caracteres numéricos, los he convertido con
strtol()
para poder trabajar con ellos. ¿Hay una función similar disponible por ICU desde que estoy convirtiendoUChar32[]
ahora?
Excelentes respuestas, solo enfatizaré para otros lectores: hacer sus comparaciones en Unicode, no como char * s. (Entonces no use "x" o "x"). De lo contrario, podría encontrarse con problemas de codepage. –