2012-05-12 12 views
6

Mi archivo de entrada (f) tiene algo de Unicode (Sueco) que no se lee correctamente.LoadFromFile con datos Unicode

Ninguno de estos métodos funciona, aunque dan resultados diferentes:

LoadFromFile(f); 

o

LoadFromFile(f,TEncoding.GetEncoding(GetOEMCP)); 

estoy usando Delphi XE

¿Cómo puedo LoadFromFile algunos datos Unicode .. .. también ¿cómo puedo guardar SaveToFile? Gracias

+0

¿Cuál es la codificación del archivo? –

+0

Use 'TEncoding.Default' en lugar de' TEncoding.GetEncoding (GetOemCP) '. –

Respuesta

10

Para cargar un archivo de texto Unicode, necesita conocer su codificación. Si el archivo tiene una marca de orden de bytes (BOM), simplemente puede llamar al LoadFromFile(FileName) y el RTL usará la lista de materiales para determinar la codificación.

Si el archivo no tiene una lista de materiales, debe especificar explícitamente la codificación, p.

LoadFromFile(FileName, TEncoding.UTF8); 
LoadFromFile(FileName, TEncoding.Unicode);//UTF-16 LE 
LoadFromFile(FileName, TEncoding.BigEndianUnicode);//UTF-16 BE 

Por alguna razón, desconocida para mí, no hay soporte incorporado para UTF-32, pero si usted tenía un archivo de este tipo, entonces sería bastante fácil para agregar una instancia TEncoding de manejar eso.

+0

La determinación de la codificación de un archivo parece ser problemática. Parece que algunos de los archivos UTF8 no tienen una lista de materiales. Esto parece funcionar: InputData.LoadFromFile (f, TEncoding.UTF8); if InputData.count = 0 luego InputData.LoadFromFile (f); ¿Hay un mejor enfoque? Sé que esta solución no es muy elegante. – bobonwhidbey

+0

Lea los primeros bytes y consulte las listas de materiales conocidas. Si no hay una lista de materiales, entonces debe conocer la codificación. Puede hacer una buena suposición, pero es un poco al azar. –

7

Supongo que quiere decir 'UTF-8' cuando dice 'Unicode'.

Si sabe que el archivo es UTF-8, y luego hacer

LoadFromFile(f, TEncoding.UTF8). 

Para guardar:

SaveToFile(f, TEncoding.UTF8); 

(. La función GetOEMCP WinAPI es para los viejos juegos de caracteres 255 caracteres)

Cuestiones relacionadas