Я обнаружил (трудный путь), что если файл имеет действительную спецификацию 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, которую я еще не установил?