Пожалуйста, прочитайте весь ответ, прежде чем начать кодирование.
Правильный ответ на вопрос - , и он не простой - в основном состоит из трех шагов:
- Вы должны определить кодовую страницу ANSI, используемую на вашем компьютере. Вы можете достичь этой цели, используя функцию GetACP () из Windows API. ( Важное замечание: вы должны получить кодовую страницу как можно скорее после извлечения имени файла, поскольку она может быть изменена пользователем.)
- Вы должны преобразовать строку ANSI в Unicode, вызвав функцию MultiByteToWideChar () Windows API с правильным параметром CodePage (полученным на предыдущем шаге). После этого шага у вас есть строка UTF-16 (практически WideString), содержащая список имен файлов.
- Вам необходимо преобразовать строку Unicode в UTF-8 с помощью UTF8Encode () или WideCharToMultiByte () Windows API. Эта функция вернет нужную вам строку UTF-8.
Однако это решение будет возвращать строку UTF-8, содержащую входную строку ANSI, это, вероятно, не лучший способ решения ваших проблем, поскольку имена файлов могут быть уже повреждены, когда функции ANSI вернули их, поэтому правильные имена файлов не гарантируются .
Правильное решение вашей проблемы намного сложнее:
Если вы хотите быть уверенными в том, что ваш список имен файлов абсолютно чистый, вы должны убедиться, что он не будет преобразован в ANSI вообще . Вы можете сделать это, явно используя "W" версию API обработки файлов. В этом случае - конечно, - вы не можете использовать TFileStream и другие объекты обработки файлов ANSI, но вызовы API Windows напрямую.
Это не , что сложно, но если у вас уже есть сложный фреймворк, например, построенный. TFileStream это может быть немного больно в @ss. В этом случае лучшим решением будет создание потомка TStream, который использует соответствующие API.
Надеюсь, мой ответ поможет вам или любому, кто сталкивается с той же проблемой. (Я должен был не так давно.)