Здравствуйте.
Для строк нужно соблюдать только одно правило: не складывать строки с разными кодировками. Иначе часть строки будет испорчена, что логично, ведь нельзя создать строку из двух разных кодировок и при этом правильно отображать её на экране. Кодировки ведь разные. Поэтому часть текста (в правильной кодировке будет отображаться правильно), а другая часть как "случайные" символы. Все примеры которые Вы описали соответствуют вышеописанному правилу. Когда Вы складывали строки в разных кодировках - получался неправильный результат. Когда в одинаковых - правильный.
Все строки, которые в коде заключены в кавычки
всегда имеют тип string.
var
S1: string;
S2: UTF8String;
begin
S1 := 'этот текст имеет тип string!';
S2 := 'этот текст тоже имеет тип string!';
end.
Если нужно чтобы строка в кавычках имела тип UTF8String, то нужно преобразовать её с помощью UTF8Encode:
var
S1: string;
S2: UTF8String;
begin
S1 := UTF8Encode('мой текст'); // в S1 запишется текст в кодировке UTF8String
S2 := UTF8Encode('мой текст'); // в S2 тоже запишется текст в кодировке UTF8String
end.
И наоборот, если текст имеет тип UTF8String, то его можно привести к string через UTF8ToString. Вот и всё. Далее нужно только не смешивать разные типы строк и преобразовывать все части строки к нужному типу. Можно рассмотреть часть кода из примера который Вы привели. Только Вы не описали переменные s и ss, непонятно какие типы данных они имеют. Наверно string? Тогда получаем следующий код:
var
s, ss: string;
begin
ss := 'Нет '; // здесь всё правильно, в переменную ss типа string записывается строка типа string
s := DateTimeToStr(Now) + ss + 'сигнала'; // а здесь всё смешивается: string := UTF8String + string + string
end.
Открываем руководство и смотрим
функцию DateTimeToStr, она возвращает строку в кодировке UTF8String. Получается, что Вы пытаетесь записать в переменную s типа string строку в которой часть текста в UTF8String, а остальная часть в string. Такую строку никак не получится отобразить в нормальном виде. Если нужно записать строку в переменную типа string, то нужно было все её части перевести в string:
var
s, ss: string;
begin
ss := 'Нет '; // здесь всё правильно, в переменную ss типа string записывается строка типа string
s := UTF8ToString(DateTimeToStr(Now)) + ss + 'сигнала'; // теперь всё правильно: string := string + string + string
end.
Если в коде разные типы не будут смешиваться, то не возникнет никаких проблем после записи в файл. Неважно даже какие переменные (string или UTF8String) Вы будете записывать в файл, главное не смешивайте разные типы в одной строке.