Лучший способ конвертировать Codepage-1251 в RTF в Unicode - PullRequest
0 голосов
/ 15 марта 2010

Я пытаюсь проанализировать RTF (через MSEDIT) на разных языках, все в Delphi 2010, чтобы создать HTML в Unicode.

Исходя из русского / кириллицы в качестве отправной точки, я обнаружил, что общая кодовая страница документа 1252 (западная), но русские части текста обозначены кодировкой шрифта (RUSSIAN_CHARSET 204).

Пока что я:

1) Использовать AnsiString (или RawByteString) при разборе RTF

2) Определить кодовую страницу с помощью поиска по кодировке шрифтов (см. http://msdn.microsoft.com/en-us/library/cc194829.aspx)

3) Перевод с использованием таблицы поиска в моем коде: (Эта таблица сгенерирована из http://msdn.microsoft.com/en-gb/goglobal/cc305144.aspx) - мне понадобится одна таблица для поддерживаемой кодовой страницы!

Должен быть лучший способ, чем этот? Желательно что-то, поставляемое ОС и поэтому менее хрупкое, чем таблицы констант.

1 Ответ

2 голосов
/ 15 марта 2010

Таблица Charset to codepage достаточно мала и статична, так что я сомневаюсь, что система предоставляет функцию для этого.

Для выполнения реальных переводов символов вы можете использовать класс SysUtils.TEncoding или функцию System.SetCodePage. Оба внутренне используют MultiByteToWideString, который использует предоставляемые ОС таблицы поиска, поэтому вам не нужно их обслуживать.

Использование SetCodePage будет выглядеть примерно так:

var
  iStart, iStop: Integer;
  RTF, RawText: AnsiString;
  Text: string;
  CodePage: Word;
begin
   ...
   CodePage := CharSetToCodePage(CharSet);
   RawText := Copy(RTF, iStart, iStop - iStart);
   SetCodePage(RawText, CodePage, False); // Set string codepage to Russian without converting it
   Text := string(RawText); // Automatic conversion from string codepage to Unicode
...