В тех случаях, когда для записи текста в файл используется TMemoryStream, важной является запись Byte Order Mark (BOM) в качестве начальных данных файла. Вот пример записи BOM в файл: var BOM: TBytes; begin ... BOM := TEncoding.UTF8.GetPreamble; Write(BOM[0], Length(BOM)); Весь пишущий код должен быть изменен на работу в кодировке UTF8 для Юникод-строк: var Temp: Utf8String; begin ... Temp := Utf8Encode(Str); // <-- Str - это строка, записываемая в файл Write(Pointer(Temp)^, Length(Temp)); //Write(Pointer(Str)^, Length(Str)); <-- это оригинальный вызов Write для записи строки в файл