На главную
Подписка
Новости


Рейтинг@Mail.ru











Главная / DELPHI / Часто задаваемые вопросы и ответы на них / Object Pascal / Принцип смены кодировок (Ansi<>OEM). А как можно определить кодировку у текста? (программно) Сделать домашней страницей Добавить в избранное Написать писмо

Принцип смены кодировок (Ansi<>OEM). А как можно определить кодировку у текста? (программно)


Перекодировать можно по разному.
1. Привести текст к windows кодировке и показать.
Для этого можно пользоваться своими процедурами на основе таблицы перекодирования. Или воспользоваться стандартными WinAPI, но таких только для DOS <--> Win.

BOOL OemToChar(
   LPCTSTR lpszSrc, // pointer to string to translate  
   LPSTR lpszDst  // pointer to translated string
  );

Т.е. это что-то вроде:
Var
p1, p2  : PChar;
begin
. . .
if (CharToOem(p1, p2)) then ...;
. . .

В итоге, в p2 нормальный текст. Одна беда, что все фнукции WinAPI работают с форматом PChar а не String. Но у Delphi ест ьнабор функций для пребразования туда обратно. Сам найдешь. И не забывай, что для pchar сначала нужно выделить память, а потом ее освободить.

2. Использовать нужный шрифт для показа текста. В этом случае вообще не надо ничего кодировать. Одна проблема, если этот текст скопировать в буфер обмена и вставить, например в блокнот, то он вставится не перекодированный. Опять же, для DOS можно исп. шрифт Terminal. А также есть и шрифты для koi-8 !!! Не в стандартной поставке windows, но в инете найти можно.

Что касается, определить кодировку. Это сложно. Обычно для этих целей создается база с наиболее часто употребляемыми словами и потом текст сравнивается на наличие таких слов. Например, предлог "как" в кодировке koi-8 выглядит "ЛБЛ". Понятно, что такое словосочетание вряд ли будет в нормальном тексте (хотя и возможно), отсюда можно заключить, что это текст в кодировке koi-8.

Для koi-8, еще можно исп. тот факт, что все маленькие буквы становятся большими, а большие маленькими. Т.е. все предложения начинаются с маленькой буквы, а дальше большие, то можно сказать, что это koi-8.

Коментарий: Сергей Истомин
если есть уверенность в том, что кодировка либо OEM либо ANSII, то определить OEM можно по наличию в тексте некоторых символов, которых нет в ANSII:

if(byte>=0x80 && byte<=0xA7) return OEM;
if(byte>=0xA9 && byte<=0xAF) return OEM;

Copyright ©   "Мастера DELPHI"   E-mail:   delphi@mastak.com  http://www.delphimaster.ru
Источник получения информации: http://www.delphimaster.ru
Hosted by uCoz