Creo que las únicas opciones reales de archivo de E/S en Fobos en este punto (aparte de llamando a las funciones C) son std.file.readText
y std.stdio.File
. readText
leerá en un archivo como una matriz de caracteres, wchars o dchars (de forma predeterminada es inmutable (char) [] - es decir, cadena). Creo que la codificación debe ser UTF-8, UTF-16 y UTF-32 para chars, wchars y dchars, respectivamente, aunque tendré que ir a profundizar en el código fuente para estar seguro. Cualquier codificación que sea compatible con esas codificaciones (por ejemplo, ASCII es compatible con UTF-8) debería funcionar bien.
Si usa File
, tiene varias opciones para leer el archivo, incluyendo readln
y rawRead
. Sin embargo, esencialmente lee el archivo usando una codificación compatible con UTF-8, UTF-16 o UTF-32, como con readText
, o lo lee como datos binarios y lo manipula usted mismo.
Dado que, los tipos de caracteres en D son char, wchar y dchar, que son unidades de código UTF-8, UTF-16 y UTF-32, respectivamente, a menos que desee leer los datos en formato binario, el archivo va a tener que codificarse en una codificación compatible con uno de esos tres tipos de Unicode. Dada una cadena en una codificación particular, puede convertirla a otra codificación usando las funciones en std.utf
. Sin embargo, no conozco ninguna forma de consultar un archivo para su tipo de codificación que no sea usar readText
para tratar de leer el archivo en una codificación dada y ver si tiene éxito.
Por lo tanto, a menos que desee procesar un archivo usted mismo y determinar sobre la marcha qué codificación contiene, su mejor opción es simplemente usar readText
con cada tipo de cadena consecutiva, utilizando la primera que tenga éxito. Sin embargo, dado que los archivos de texto normalmente están en UTF-8 o en una codificación compatible con UTF-8, esperaría que readText
utilizado con una cadena normal casi siempre funcionaría bien.
Hm ... alguna idea de qué hacer con las listas de materiales? – Mehrdad
@Lambert, recomiendo usar read() ya que no hará ninguna validación, pero puede hacerlo usted mismo y no está leyendo el archivo varias veces. Para la BOM puedes convertir a ubyte y comparar los primeros bytes, luego hacer un molde para el resto del segmento ... –
Hm ... no era la solución que esperaba (no quería verificar manualmente la lista de materiales)) pero no es tan malo, supongo; Gracias. – Mehrdad