Я обнаружил (трудный путь), что если файл имеет действительную спецификацию UTF-8, но содержит любые недопустимые кодировки UTF8 и считывается с помощью любого из методов с поддержкой кодирования Delphi (2009+), таких как LoadFromFile, то результатом будет полностью пустой файл без указания ошибки. В нескольких моих приложениях я бы предпочел просто потерять несколько неправильных кодировок, даже если в этом случае я не получу отчет об ошибке.
Отладка показывает, что MultiByteToWideChar вызывается дважды, сначала для получения размера выходного буфера, а затем для преобразования. Но TEncoding.UTF8 содержит закрытое значение FMBToWCharFlags для этих вызовов, и это инициализируется значением MB_ERR_INVALID_CHARS. Таким образом, вызов для получения charcount возвращает 0, а загруженный файл полностью пуст. Вызов этого API без флага будет "незаметно бросать незаконные кодовые точки".
Мой вопрос заключается в том, как лучше сплести через гнездо классов в области кодирования, чтобы обойти тот факт, что это личное значение (и должно быть, потому что это класс var для всех потоков). Я думаю, что я мог бы добавить пользовательскую кодировку UTF8, используя руководство в книге Marco Cantu Delphi 2009. И он мог бы при необходимости вызвать исключение, если MultiByteToWideChar вернул ошибку кодирования после повторного вызова без флага. Но это не решает проблему использования моей пользовательской кодировки вместо Tencoding.UTF8.
Если бы я мог просто установить это значение по умолчанию для приложения при инициализации, возможно, фактически изменив класс var для Tencoding.UFT8, этого, вероятно, будет достаточно.
Конечно, мне нужно решение, не дожидаясь появления отчета по контролю качества, требующего более надежного дизайна, принятия его и просмотра его изменения.
Любые идеи были бы очень желанными. И может кто-то подтвердить, что это все еще проблема для XE4, которую я еще не установил?