c++ - manejo - ¿Hay una forma estándar de abrir un fopen con una ruta de archivo de cadena Unicode?
guardar y leer datos en un archivo.txt en c (3)
En * nix, simplemente use el fopen estándar (consulte más información en respuesta de TokeMacGuy o en este foro ) En Windows, puede usar _wfopen y luego pasar una cadena Unicode (para obtener más información, vea MSDN ).
Como no existe una forma común real, incluiría esta llamada en una macro, junto con todas las demás funciones dependientes del sistema.
¿Hay una forma estándar de abrir un fopen con una ruta de archivo de cadena Unicode?
Esta es una cuestión de su ubicación actual. en mi sistema, que está habilitado para Unicode, las rutas de archivos estarán en Unicode. Puedo detectar esto por medio del comando de configuración regional:
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
La codificación de las rutas de archivos normalmente se establece en todo el sistema, por lo que si la ruta del archivo no está en la configuración regional del sistema, deberá convertirla, tal vez mediante la biblioteca iconv .
No, no hay una forma estándar. Hay algunas diferencias entre los sistemas operativos. Así es cómo diferentes sistemas operativos manejan nombres de archivo que no son ASCII.
Linux
En Linux, un nombre de archivo es simplemente una cadena binaria. La convención en la mayoría de las distribuciones modernas es usar UTF-8 para nombres de archivos que no sean ASCII. Pero al principio, era común codificar nombres de archivo como ISO-8559-1. Básicamente depende de cada aplicación elegir una codificación, por lo que incluso puede tener diferentes codificaciones utilizadas en el mismo sistema de archivos. La variable de entorno LANG
puede darle una pista sobre cuál es la codificación preferida. Pero en estos días, probablemente puedas asumir UTF-8 en todas partes.
Sin embargo, esto no está exento de problemas, ya que un nombre de archivo que contiene una secuencia UTF-8 no válida es perfectamente válido en la mayoría de los sistemas de archivos Linux. ¿Cómo se especifica ese nombre de archivo si solo es compatible con UTF-8? Idealmente, debe admitir nombres de archivo UTF-8 y binarios.
OS X
El sistema de archivos HFS en OS X usa nombres de archivos Unicode (UTF-16) internamente. La mayoría de las funciones de biblioteca C (y POSIX) como fopen
aceptan cadenas UTF-8 (ya que son compatibles con 8 bits) y las convierten internamente.
Windows
La API de Windows usa UTF-16 para nombres de archivo, pero fopen
solo es compatible con ASCII. Muchas funciones de la biblioteca C tienen un equivalente no estándar que acepta UTF-16 ( wchar_t
en Windows). Por ejemplo, _wfopen
lugar de fopen
.