Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Дайте ф-ции перевода KOI8-R, RTF --> ANSI


Автор: Alexeyt 16.8.2007, 20:40
1 Ищется ф-ция (или таблица символов, array[0..255] of char)
для перевода KOI8-R --> ANSI.

2 Ищется способ без использования VCL перевести RTF --> ANSI.
Без создания временного RichEdit: прога консольная, поэтому цеплять RE не 
хочется...

Автор: Matematik 16.8.2007, 20:48
1) UCodeTables.pas получено из таблицы перекодировки для апача (apache.lexa.ru)

Код

// kod1 - из
// kod2 - в
procedure conve234(kod1,kod2:Integer;var s:AnsiString);
var j:Integer;
begin
  if (kod1 in [1..4]) and (kod2 in [1..4]) then
    for j:=1 to length(s) do
      s[j] := Char(UCodeTables.CodeTables[kod1, kod2][Byte(s[j])]);
end;


2) поищи тут http://www.google.com/codesearch типа rtf2txt

Автор: jonie 21.8.2007, 22:59
можно воспользоваться системой) Думаю из C переведете в Delphi без проблем, все функции из WinAPI
Код

// Константы для кодовых страниц
#define CP_KOI8       20866
#define CP_KOI8R      20866
#define CP_KOI8U      21866
#define CP_ISO_8859_5 28595

// Исключительно для удобства
#define CP_1251       1251

// Инлайновые обертки для сокращения кода

// Самая нужная из них
inline BOOL ConvertCP(UINT uiIN, UINT uiOUT, CString& szString){
  BOOL bRet = ConvertCP(uiIN, uiOUT, szString.GetBuffer(szString.GetLength()+1));
  szString.ReleaseBuffer();
  return bRet;
}

// Аналогичные можно определить по вкусу, смотря какое
// преобразованеи используется чаще
inline BOOL ConvertToKOI8(UINT uiIN, LPSTR lpString){
  return(ConvertCP(uiIN, CP_KOI8R, lpString));
}

inline BOOL ConvertFromKOI8(UINT uiOUI, LPSTR lpString){
  return(ConvertCP(CP_KOI8R, uiOUI, lpString));
}


inline BOOL ConvertToKOI8(UINT uiIN, CString& szString){
  return(ConvertCP(uiIN, CP_KOI8R, szString));
}

inline BOOL ConvertFromKOI8(UINT uiOUI, CString& szString){
  return(ConvertCP(CP_KOI8R, uiOUI, szString));
}

// Преобразование кодировки "на месте"
BOOL ConvertCP(UINT uiIN, UINT uiOUT, LPSTR lpString){
  if(!lpString) return FALSE; // Получили NULL - нехорошо, ошибочка
  if(!lpString[0]) return TRUE; // Пустая строка - OK, преобразования не надо

  // Сперва определяем необходимый размер промежуточного буфера
  int nRet = MultiByteToWideChar(uiIN, MB_PRECOMPOSED, lpString, -1, NULL, 0);
  if(nRet == 0) return FALSE;

  // Создаем его
  WCHAR* pwcBuffer = new WCHAR[nRet+2];

  // Преобразование uiIN -> Юникод
  nRet = MultiByteToWideChar(uiIN, MB_PRECOMPOSED, lpString, -1, pwcBuffer, nRet+2);
  if(nRet ==

    delete[] pwcBuffer;
    return FALSE;
  }

  // Преобразование Юникод -> uiOUT.
  // Неизвестные символы заменяем "#". Кому такое поведение не нравится, может
  // "поиграть" с параметрами WideCharToMultiByte()
  nRet = WideCharToMultiByte(uiOUT, 0, pwcBuffer, -1, lpString, strlen(lpString)+1, "#", NULL);
  // Освобождаем память
  delete[] pwcBuffer;

  if(nRet == 0) return FALSE;

  return TRUE;
}

Автор: Alexeyt 22.8.2007, 05:10
Спасибо.

Автор: sentry 22.8.2007, 10:23
Alexeyt, если все сделал, то пометь вопрос решенным. А если нет, то предложу еще один вариант.

1) пишем в Word строку символов, нуждающихся в перекодировке (естественно, первые 128 символов не пишем);
2) сохраняем это как только текст в кодировке Windows;
3) сохраняем это же в других файлах, назначая другие кодировки;
4) открываем файл с кодировкой, отличной от Windows, но при открытии указываем, что хотим читать его как некодированный текст;
5) копируем получившуюся строку.

Вот урезанный пример:
Код

const
  WIN: string = 'абв';
  KOIR: string = 'БВЧ';
  // ...
function Convert(const S, Lang1, Lang2: string): string;
var
  I, P: Integer;
begin
  Result := S;
  for I := 1 to Length(S) do
  begin
    P := Pos(S[I], Lang1);
    if P > 0 then
      Result[I] := Lang2[P];
  end; 
end;  
  //...
S := Convert(S, WIN, KOIR);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)