2012-05-12 1 views
6

В моем входном файле (f) есть Unicode (шведский), который не читается правильно.LoadFromFile с данными Юникода

Ни один из этих подходов работает, хотя они дают разные результаты:

LoadFromFile(f); 

или

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

Я использую Delphi XE

Как LoadFromFile некоторые данные Unicode .. .. также как я могу сохранить SaveToFile? Спасибо

+0

Что такое кодировка файла? –

+0

Используйте 'TEncoding.Default' вместо' TEncoding.GetEncoding (GetOemCP) '. –

ответ

10

Чтобы загрузить текстовый файл в формате Юникод, вам необходимо знать его кодировку. Если у файла есть знак порядка байтов (BOM), вы можете просто вызвать LoadFromFile(FileName), а RTL будет использовать спецификацию для определения кодировки.

Если у файла нет спецификации, вам необходимо явно указать кодировку, например.

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

По какой-то причине, мне неизвестно, нет встроенной поддержкой UTF-32, но если у вас такой файл, то достаточно было бы легко добавить TEncoding экземпляр справиться с этим.

+0

Определение кодировки файла кажется проблематичным. Похоже, что некоторые файлы UTF8 не имеют спецификации. Это, как представляется, работает: InputData.LoadFromFile (f, TEncoding.UTF8); если InputData.count = 0, то InputData.LoadFromFile (f); Есть ли лучший подход. Я знаю, что это решение не очень элегантно. – bobonwhidbey

+0

Прочитайте первые несколько байтов и проверьте их на наличие известных спецификаций. Если нет спецификации, вам необходимо знать кодировку. Вы можете сделать хорошее предположение, но это бит и промах. –

7

Я предполагаю, что вы имеете в виду «UTF-8», когда вы говорите «Юникод».

Если вы знаете, что файл UTF-8, то сделайте

LoadFromFile(f, TEncoding.UTF8). 

Чтобы сохранить:

SaveToFile(f, TEncoding.UTF8); 

(. Функция GetOEMCP WinAPI для старых наборов символов 255-символов)

Смежные вопросы