Главная / FAQ по Builder'у / 93 Как сделать автораспознование...

93 Как сделать автораспознование кодировок текста (WIN,DOS) ?


Я встретил где-то инфу о том, что надо считать букву 'o' и сделал так:

//---------------------------------------------------------------------------
// Определяем кодировку, возвращаем 1 - если DOS, 2 - если WIN
// Считаем кол-во букв "о" в обеих кодировках
//---------------------------------------------------------------------------
int __fastcall TMainForm::what_codepage(std::vector<std::string> in)
{
    int win_count=0, dos_count=0;
    for(size_t j=0; j<in.size(); j++)
        for(size_t i=0; i<in[j].size(); i++)
            switch (in[j][i]) {
                // 174 - русская "о" в DOS кодировке
                case 174:
                    dos_count++;
                    break;
                // 238 - русская "о" в WIN кодировке
                case 238:
                    win_count++;
                    break;
                default :
                    break;
            }

    if(win_count > dos_count)
        return 2;

    return 1;
}
Maksim Pozdeyev 2:5090/67.6
Бывает... Я бы сделал по-другому.
what_codepage(unsigned char * data, int data_size)
  {
   bool RetValue;
  int * Statistic = (int *)calloc(256, sizeof(int)); // с обнулением

  for ( int i = 0, i < data_size; ++i)
     {
      ++Statistic[data[i]];
     }

  RetValue = Statistic[174] > Statistic[238];

  free(Statistic);

  return RetValue;
  }
P.S. Для больших data_size не обязательно читать весь текст.
Andrey Belyakov

Предыдущий вопрос   |  Список вопросов   |   Следующий вопрос

источник      На главную      by jenyok
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz