Diferentes apóstrofes en C

Estoy escribiendo un progtwig que lee archivos de texto y lee los caracteres en una matriz.

Necesito que se haga, carácter por carácter en la matriz, y necesito desinfectar los caracteres del espacio en blanco, la puntuación y el uso de mayúsculas.

Ya he escrito el código para hacerlo. Sin embargo, la asignación que estoy siguiendo tiene un documento de texto específico que debo desinfectar.

El problema es que la función ispunct no marca los apóstrofes del documento. Si quito los apóstrofes del documento de texto y los reemplazo por apóstrofes normales, funciona bien. Creo que eso no es lo suficientemente bueno porque no usaré mi propio documento de texto como prueba de la validez del progtwig.

He intentado incluir una statement específicamente para ese apóstrofe:

si no (c == ” ‘) [que se extrae de c = fgetc (fp)], obtengo una constante de caracteres de varios caracteres [-Wmultichar].

¡Este pequeño detalle me está volviendo loco, y no puedo decir por qué los apóstrofes son diferentes!

“that” Aquí hay una parte del texto del documento, cuando se convierte a hex es igual a 74 68 61 74 e2 80 99 73.

Quizás su entrada esté codificada en UTF-8 (lo cual es bueno, lea acerca de UTF8 en todas partes ). Solo usted (o su usuario) puede decir eso (pero lea acerca de las marcas de orden de bytes) . En Linux, el comando file (1) a menudo puede adivinar archivos de texto codificados en UTF-8.

Pero UTF-8 es una encoding de byte variable (algunos caracteres Unicode están representados por varios bytes, y en casi todas las implementaciones C11, un byte es un char ) y no es conocido por el estándar C11 reciente. Así que necesitas analizar tu flujo de bytes como UTF-8. Tenga en cuenta que strlen ya no proporciona el número de (o la longitud en) caracteres UTF-8 , sino simplemente la longitud en bytes . Por lo tanto, debe pensar que char significa un byte , no un carácter Unicode.

Recomiendo usar alguna biblioteca externa para el análisis de UTF-8, como las funciones de Manipulación de Glib Unicode o la mucho más simple libunistring . Si no se le permite usar una biblioteca externa de este tipo, puede ignorar todos los caracteres UTF-8 multibyte omitiendo cada char cuyo bit más alto esté establecido (pero eso podría ser complicado si desea escribir código C portátil, ya que algunas implementaciones de C tienen char lo mismo que signed char y otras implementaciones tienen char lo mismo que unsigned char ). No recomiendo usar wchar_t que es específico de la implementación y del sistema operativo (y diferente en Linux y Windows).

He intentado else if(c==''')

El archivo fuente de C que contiene el fragmento de código anterior (muy probablemente) también está codificado en UTF-8, por lo que el literal de carácter ''' es un literal de carácter de múltiples bytes (como 'ab' o '⬮' también lo es), en realidad es una U+2019 RIGHT SINGLE QUOTATION MARK y la misma que '\342\200\231' , y su interpretación es específica de la implementación. En general, debería evitar tales caracteres de varios bytes en su código fuente de C (fuera de cadenas literales como "éx⁂" o comentarios).

Un mejor enfoque podría ser pensar en qué caracteres quedan después de haber eliminado a todos los ilegales. Si es solo az , y algunos otros, ese es un rango fácil de detectar.