2010-01-05 18 views
11

Cuando invocamos la llamada al sistema en linux como 'open' o la función stdio como 'fopen' debemos proporcionar un 'const char * filename'. Mi pregunta es ¿cuál es la codificación utilizada aquí? Es utf-8 o ascii o iso8859-x? ¿Depende de la configuración del sistema o del entorno?¿Qué codificación se utiliza al invocar fopen o abrir?

Sé en MS Windows hay un _wopen que aceptan utf-16.

+0

Relacionados: http://serverfault.com/questions/87055/change-filesystem-encoding-to-utf-8-in-ubuntu –

Respuesta

6

Es una cadena de bytes, la interpretación depende del sistema de archivos en particular.

6

Depende de la configuración regional del sistema. Mire el resultado del comando "locale". Si las variables terminan en UTF-8, su configuración regional es UTF-8. La mayoría de los linux modernos usarán UTF-8. Aunque Andrew tiene razón en que técnicamente es solo una cadena de bytes, si no coincide con la configuración regional del sistema, es posible que algunos programas no funcionen correctamente y sea imposible obtener la entrada correcta del usuario, etc. Lo mejor es seguir con UTF-8.

+1

Tenga en cuenta que es posible tener archivos cuyos nombres están codificados en otras codificaciones que el sistema predeterminado, por ejemplo, si descomprime un archivo comprimido (tarball, ZIP, etc.) empaquetado por alguien con una codificación diferente a la suya. – alvherre

+1

De hecho, esto es muy cierto. ¿No deseamos que todos usen UTF-8? –

3

Las llamadas al sistema de archivos en Linux son independientes de la codificación, es decir, no (necesitan) saber sobre la codificación en particular. En lo que a ellos respecta, la cadena de bytes apuntada por el argumento del nombre de archivo se pasa al sistema de archivos tal como está. El sistema de archivos espera que los nombres de los archivos tengan la codificación correcta (generalmente UTF-8, tal como lo menciona Matthew Talbert).

Esto significa que a menudo no necesita hacer nada (los nombres de archivo se tratan como byte-strings opacos), pero realmente depende de dónde recibe el nombre de archivo y si necesita manipular el nombre de archivo de cualquier manera .

0

Hice algunas consultas adicionales sobre este tema y llegué a la conclusión de que hay dos formas diferentes de cómo la codificación de nombre de archivo puede ser manejada por los sistemas de archivos unixoid.

  1. nombres de los archivos se codifican en la "configuración regional Inglés", que suele ser, pero no tiene que ser la misma que la configuración regional del entorno actual que se refleja en el comando locale (pero algunos preestablecido en un archivo de configuración global)

  2. Los nombres de los archivos están codificados en UTF-8, independientemente de las configuraciones regionales.

GTK + resuelve este lío asumiendo UTF-8 y permitiendo a anularlo ya sea por la codificación localización actual o una codificación proporcionada por el usuario.

Qt lo resuelve asumiendo que la codificación de la configuración regional (y que la configuración regional del sistema se refleja en la configuración regional actual) y que permite anularla con una función de conversión proporcionada por el usuario.

Así que la conclusión es: Use UTF-8 o lo que LC_ALL o LANG le dicen por defecto, y proporcione una configuración de anulación al menos para la otra alternativa.

Cuestiones relacionadas