vitaly_l писал(а):Как определить в какой кодировке строка?
Обычно это не определяют, а стараются знать наверняка. Как - см. пост
dunin, и заметку ниже. Теоретически, можно попытаться угадать кодировку (см. функцию GuessEncoding из модуля LConvEncoding), но это накладно по ресурсам и не на 100% надёжно (т.е. алгоритм определения может ошибиться).
vitaly_l писал(а):Как определить если половина строки в другой кодировке?
Такого нельзя допускать, получится некорректная строка. Перебирать все возможные варианты сочетания частей во всех возможных кодировках слишком ресурсоёмко.
vitaly_l писал(а):Возможно есть иные (более правильные) варианты?
Да: знать какая функция с какой кодировкой работает, и какая переменная строку в какой кодировке хранит. В будущих версиях FPC, возможно, появятся строки, которые сами "знают" о том, в какой кодировке хранятся, но пока за кодировкой нужно следить нам самим.
vitaly_l писал(а):При этом часть стандартных функций самостоятельно используют UTF8Encode или UTF8ToSys, а часть нет...
Те, что являются частью Lazarus - используют. Те что являются частью FPC - нет. Проверить просто. Нужно зажать на клавиатуре Ctrl и щёлкнуть мышкой на интересующую функцию. Откроется модуль, в котором она описана. В редакторе кода Lazarus в правом нижнем углу указан путь к текущему модулю. Если этот модуль лежит в папке Lazarus'а - функция почти наверняка использует UTF8ToSys сама (в этом можно убедиться, посмотрев её код). Если файл лежит в папке исходного кода FPC, то функция в нём не использует UTF8ToSys, а работает с системной кодировкой. Если файл исходного кода не открылся - это внутренняя функция компилятора, и тоже не использует UTF8ToSys.
vitaly_l писал(а):Тобишь UTF8ToSys и UTF8Encode - сами определяют кодировку, а я просто их неверно применил...???
Так? ("ДА" / "НЕТ") ?!
НЕТ, сами не определяют.
dunin писал(а):Что делает UTF8Encode сам до конца не понимаю, использую его при работе с XML-инами.
UTF8Encode преобразует WideString (UCS2, UTF-16) в UTF-8.
UTF8Decode, наоборот, преобразует UTF-8 в WideString (UCS2, UTF-16).
Поскольку FCL-XML использует именно WideString, при работе с этой библиотекой из проектов Lazarus приходится вызывать эти функции.
Ещё WideString используется в вызовах WinAPI-функций, поддерживающих Unicode (тех, которые заканчиваются на W).
Если WideString не используется, UTF8Encode/UTF8Decode ни к чему.