SRC: Win2KOI, KOI2Win etc. converters
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 22.10.02 12:19
Оценка: 24 (2)
В общем, вот вам Конвертеры в/из (переписано на С++ с Паскаля мной; исходный источник указан).

Хидер:

// conv.h header file
//---------------------------------------------------------------------------
//From: "Maxim Docenko" <maxim.docenko@books.ru> (Pascal sources)
// Modified to C++ sources by Flamer (flame@rsdn.ru)
//---------------------------------------------------------------------------
#ifndef convH
#define convH
//---------------------------------------------------------------------------
extern char* latrus(char* cStr);
extern char* rupper(char* cStr);
extern char* rlower(char* cStr);
extern char* dos2win(char* cStr);
extern char* win2dos(char* cStr);
extern char* koi82win(char* cStr);
extern char* koi82dos(char* cStr);
extern char* dos2koi8(char* cStr);
extern char* win2koi8(char* cStr);
//---------------------------------------------------------------------------
#endif


Сорц:


// conv.cpp source file
//---------------------------------------------------------------------------
#include "conv.h"
//---------------------------------------------------------------------------
char rus_chars [] = {
         197,210,211,206,208,192,205,202,213,209
                ,194,204,229,243,232,238,240,224,234,245,241,236,
                0};
//---------------------------------------------------------------------------
char* lat_chars = "ETYOPAHKXCBMeyuopakxcm";
//---------------------------------------------------------------------------
char small_chars[] = {
113,119,101,114,116,121,117,105,111,112,97,115,100,102,103
,104,106,107,108,122,120,99,118,98,110,109,233,246,243,234
,229,237,227,248,249,231,245,250,244,251,226,224,239,240,238
,235,228,230,253,255,247,241,236,232,242,252,225,254,184,0};
//---------------------------------------------------------------------------
char cap_chars [] = {
81,87,69,82,84,89,85,73,79,80,65,83,68,70,71,72,74,75,76,90
,88,67,86,66,78,77,201,214,211,202,197,205,195,216,217,199
,213,218,212,219,194,192,207,208,206,203,196,198,221,223,215
,209,204,200,210,220,193,222,168,0};
//---------------------------------------------------------------------------
char cp1251 [] = {
233,246,243,234,229,237,227,248,249,231,245,250,244,251,226
,224,239,240,238,235,228,230,253,255,247,241,236,232,242,252
,225,254,184,201,214,211,202,197,205,195,216,217,199,213,218
,212,219,194,192,207,208,206,203,196,198,221,223,215,209,204
,200,210,220,193,222,168,0};
//---------------------------------------------------------------------------
char cp866 [] = {
169,230,227,170,165,173,163,232,233,167,229,234,228,235,162
,160,175,224,174,171,164,166,237,239,231,225,172,168,226,236
,161,238,241,137,150,147,138,133,141,131,152,153,135,149,154
,148,155,130,128,143,144,142,139,132,134,157,159,151,145,140
,136,146,156,129,158,240,0};
//---------------------------------------------------------------------------
char koi8 [] = {
 202,195,213,203,197,206,199,219,221,218,200,223,198,217,215,193
,208,210,207,204,196,214,220,209,222,211,205,201,212,216,194,192
,163,234,227,245,235,229,238,231,251,253,250,232,255,230,249,247,225
,240,242,239,236,228,246,252,241,254,243,237,233,244,248,226,224
,179, 0};
//---------------------------------------------------------------------------
char* replace_it(char* cStr, char* scr, char* dest) {

  int i=0,j=0;
  while (cStr[i]!=0) {

    j=0;
    while (scr[j]!=0) {

       if (cStr[i]==scr[j]) {
         cStr[i]=dest[j];
         break;
       }
       j++;
    }
    i++;
 }

return cStr;
}
//---------------------------------------------------------------------------
char* latrus(char* cStr) {
return replace_it(cStr,lat_chars,rus_chars);
}
//---------------------------------------------------------------------------
char* rupper(char* cStr) {
  return replace_it(cStr,small_chars,cap_chars);
}
//---------------------------------------------------------------------------
char* rlower(char* cStr) {
  return replace_it(cStr,cap_chars,small_chars);
}
//---------------------------------------------------------------------------
char* dos2win(char* cStr) {
  return replace_it(cStr,cp866,cp1251);
}
//---------------------------------------------------------------------------
char* win2dos(char* cStr) {
  return replace_it(cStr,cp1251,cp866);
}
//---------------------------------------------------------------------------
char* koi82win(char* cStr) {
  return replace_it(cStr,koi8,cp1251);
}
//---------------------------------------------------------------------------
char* koi82dos(char* cStr) {
  return replace_it(cStr,koi8,cp866);
}
//---------------------------------------------------------------------------
char* dos2koi8(char* cStr) {
  return replace_it(cStr,cp866,koi8);
}
//---------------------------------------------------------------------------
char* win2koi8(char* cStr) {
  return replace_it(cStr,cp1251,koi8);
}
//---------------------------------------------------------------------------


Пример использования:

char buff[] = "оПХБЕР!";
::MessageBox(NULL,win2koi8(buff),NULL,MB_OK);


З.Ы. Каюсь,не тестировал на корректность таблицы символов...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.