¿Cómo detectar UTF-8 en plano C?
Estoy buscando un fragmento de código en C antiguo que detecte que la cadena dada está en codificación UTF-8. Conozco la solución con expresiones regulares, pero por varias razones, sería mejor evitar el uso de cualquier cosa que no sea C simple en este caso particular.
La solución con expresiones regulares tiene este aspecto (advertencia: se omiten varios controles):
<code>#define UTF8_DETECT_REGEXP "^([\x09\x0A\x0D\x20-\x7E]|[\xC2-\xDF][\x80-\xBF]|\xE0[\xA0-\xBF][\x80-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}|\xED[\x80-\x9F][\x80-\xBF]|\xF0[\x90-\xBF][\x80-\xBF]{2}|[\xF1-\xF3][\x80-\xBF]{3}|\xF4[\x80-\x8F][\x80-\xBF]{2})*$" const char *error; int error_off; int rc; int vect[100]; utf8_re = pcre_compile(UTF8_DETECT_REGEXP, PCRE_CASELESS, &error, &error_off, NULL); utf8_pe = pcre_study(utf8_re, 0, &error); rc = pcre_exec(utf8_re, utf8_pe, str, len, 0, 0, vect, sizeof(vect)/sizeof(vect[0])); if (rc > 0) { printf("string is in UTF8\n"); } else { printf("string is not in UTF8\n") } </code>