Как преобразовать текстовый файл из ANSI в UTF-8 с помощью Delphi 7? - PullRequest
8 голосов
/ 02 апреля 2009

Я написал программу на Delphi 7, которая ищет *.srt файлы на жестком диске. Эта программа перечисляет путь и имя этих файлов в заметке. Теперь мне нужно конвертировать эти файлы из ANSI в UTF-8, но мне это не удалось.

Ответы [ 5 ]

9 голосов
/ 04 июля 2009

Функция Utf8Encode принимает строку WideString в качестве параметра и возвращает строку Utf-8.

Пример:

procedure ConvertANSIFileToUTF8File(AInputFileName, AOutputFileName: TFileName);
var
  Strings: TStrings;
begin
  Strings := TStringList.Create;
  try
    Strings.LoadFromFile(AInputFileName);
    Strings.Text := UTF8Encode(Strings.Text);
    Strings.SaveToFile(AOutputFileName);
  finally
    Strings.Free;
  end;
end;
1 голос
/ 06 июля 2009

Взгляните на GpTextStream , который выглядит так, как будто он работает с Delphi 7. Он имеет возможность чтения / записи файлов Unicode в более старых версиях Delphi (хотя работает с Delphi 2009) и должен помочь ваше обращение.

0 голосов
/ 31 июля 2013

Пожалуйста, прочитайте весь ответ, прежде чем начать кодирование.


Правильный ответ на вопрос - , и он не простой - в основном состоит из трех шагов:

  1. Вы должны определить кодовую страницу ANSI, используемую на вашем компьютере. Вы можете достичь этой цели, используя функцию GetACP () из Windows API. ( Важное замечание: вы должны получить кодовую страницу как можно скорее после извлечения имени файла, поскольку она может быть изменена пользователем.)
  2. Вы должны преобразовать строку ANSI в Unicode, вызвав функцию MultiByteToWideChar () Windows API с правильным параметром CodePage (полученным на предыдущем шаге). После этого шага у вас есть строка UTF-16 (практически WideString), содержащая список имен файлов.
  3. Вам необходимо преобразовать строку Unicode в UTF-8 с помощью UTF8Encode () или WideCharToMultiByte () Windows API. Эта функция вернет нужную вам строку UTF-8.

Однако это решение будет возвращать строку UTF-8, содержащую входную строку ANSI, это, вероятно, не лучший способ решения ваших проблем, поскольку имена файлов могут быть уже повреждены, когда функции ANSI вернули их, поэтому правильные имена файлов не гарантируются .


Правильное решение вашей проблемы намного сложнее:

Если вы хотите быть уверенными в том, что ваш список имен файлов абсолютно чистый, вы должны убедиться, что он не будет преобразован в ANSI вообще . Вы можете сделать это, явно используя "W" версию API обработки файлов. В этом случае - конечно, - вы не можете использовать TFileStream и другие объекты обработки файлов ANSI, но вызовы API Windows напрямую.

Это не , что сложно, но если у вас уже есть сложный фреймворк, например, построенный. TFileStream это может быть немного больно в @ss. В этом случае лучшим решением будет создание потомка TStream, который использует соответствующие API.

Надеюсь, мой ответ поможет вам или любому, кто сталкивается с той же проблемой. (Я должен был не так давно.)

0 голосов
/ 03 июля 2009
var
  Latin1Encoding: TEncoding;
begin
  Latin1Encoding := TEncoding.GetEncoding(28591);
  try
       MyTStringList.SaveToFile('some file.txt', Latin1Encoding);
  finally
      Latin1Encoding.Free;
  end;
end;
0 голосов
/ 02 апреля 2009

Вы имели в виду ASCII?

ASCII обратно совместим с UTF-8. http://en.wikipedia.org/wiki/UTF-8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...