ПРОЕКТ "ПОЛЯНА"


 
Алексей Андрюнин

C++ source

/*****************************************************************
* *
* cyr_code.cpp: функция перекодировки строк в разных кодировках *
* кириллицы *
* *
* Copyright (c) 2003, Андрюнин А.В. *
* *
*****************************************************************/

#include "stdafx.h"
#include "cyr_code.h"

#define SYMBOLSNUM 111
#define CODEPAGES 5

#pragma warning(disable : 4305)
#pragma warning(disable : 4309)

const unsigned char EncodingTable[SYMBOLSNUM][CODEPAGES] =
{
/* KOI8 1251 866 Mac ISO */
/*01*/ {0xE1, 0xC0, 0x80, 0x80, 0xB0}, /*А*/
/*02*/ {0xE2, 0xC1, 0x81, 0x81, 0xB1}, /*Б*/
/*03*/ {0xF7, 0xC2, 0x82, 0x82, 0xB2}, /*В*/
/*04*/ {0xE7, 0xC3, 0x83, 0x83, 0xB3}, /*Г*/
/*05*/ {0xE4, 0xC4, 0x84, 0x84, 0xB4}, /*Д*/
/*06*/ {0xE5, 0xC5, 0x85, 0x85, 0xB5}, /*Е*/
/*07*/ {0xF6, 0xC6, 0x86, 0x86, 0xB6}, /*Ж*/
/*08*/ {0xFA, 0xC7, 0x87, 0x87, 0xB7}, /*З*/
/*09*/ {0xE9, 0xC8, 0x88, 0x88, 0xB8}, /*И*/
/*10*/ {0xEA, 0xC9, 0x89, 0x89, 0xB9}, /*Й*/
/*11*/ {0xEB, 0xCA, 0x8A, 0x8A, 0xBA}, /*К*/
/*12*/ {0xEC, 0xCB, 0x8B, 0x8B, 0xBB}, /*Л*/
/*13*/ {0xED, 0xCC, 0x8C, 0x8C, 0xBC}, /*М*/
/*14*/ {0xEE, 0xCD, 0x8D, 0x8D, 0xBD}, /*Н*/
/*15*/ {0xEF, 0xCE, 0x8E, 0x8E, 0xBE}, /*О*/
/*16*/ {0xF0, 0xCF, 0x8F, 0x8F, 0xBF}, /*П*/
/*17*/ {0xF2, 0xD0, 0x90, 0x90, 0xC0}, /*Р*/
/*18*/ {0xF3, 0xD1, 0x91, 0x91, 0xC1}, /*С*/
/*19*/ {0xF4, 0xD2, 0x92, 0x92, 0xC2}, /*Т*/
/*20*/ {0xF5, 0xD3, 0x93, 0x93, 0xC3}, /*У*/
/*21*/ {0xE6, 0xD4, 0x94, 0x94, 0xC4}, /*Ф*/
/*22*/ {0xE8, 0xD5, 0x95, 0x95, 0xC5}, /*Х*/
/*23*/ {0xE3, 0xD6, 0x96, 0x96, 0xC6}, /*Ц*/
/*24*/ {0xFE, 0xD7, 0x97, 0x97, 0xC7}, /*Ч*/
/*25*/ {0xFB, 0xD8, 0x98, 0x98, 0xC8}, /*Ш*/
/*26*/ {0xFD, 0xD9, 0x99, 0x99, 0xC9}, /*Щ*/
/*27*/ {0xFF, 0xDA, 0x9A, 0x9A, 0xCA}, /*Ъ*/
/*28*/ {0xF9, 0xDB, 0x9B, 0x9B, 0xCB}, /*Ы*/
/*29*/ {0xF8, 0xDC, 0x9C, 0x9C, 0xCC}, /*Ь*/
/*30*/ {0xFC, 0xDD, 0x9D, 0x9D, 0xCD}, /*Э*/
/*31*/ {0xE0, 0xDE, 0x9E, 0x9E, 0xCE}, /*Ю*/
/*32*/ {0xF1, 0xDF, 0x9F, 0x9F, 0xCF}, /*Я*/
/*33*/ {0xC1, 0xE0, 0xA0, 0xE0, 0xD0}, /*а*/
/*34*/ {0xC2, 0xE1, 0xA1, 0xE1, 0xD1}, /*б*/
/*35*/ {0xD7, 0xE2, 0xA2, 0xE2, 0xD2}, /*в*/
/*36*/ {0xC7, 0xE3, 0xA3, 0xE3, 0xD3}, /*г*/
/*37*/ {0xC4, 0xE4, 0xA4, 0xE4, 0xD4}, /*д*/
/*38*/ {0xC5, 0xE5, 0xA5, 0xE5, 0xD5}, /*е*/
/*39*/ {0xD6, 0xE6, 0xA6, 0xE6, 0xD6}, /*ж*/
/*40*/ {0xDA, 0xE7, 0xA7, 0xE7, 0xD7}, /*з*/
/*41*/ {0xC9, 0xE8, 0xA8, 0xE8, 0xD8}, /*и*/
/*42*/ {0xCA, 0xE9, 0xA9, 0xE9, 0xD9}, /*й*/
/*43*/ {0xCB, 0xEA, 0xAA, 0xEA, 0xDA}, /*к*/
/*44*/ {0xCC, 0xEB, 0xAB, 0xEB, 0xDB}, /*л*/
/*45*/ {0xCD, 0xEC, 0xAC, 0xEC, 0xDC}, /*м*/
/*46*/ {0xCE, 0xED, 0xAD, 0xED, 0xDD}, /*н*/
/*47*/ {0xCF, 0xEE, 0xAE, 0xEE, 0xDE}, /*о*/
/*48*/ {0xD0, 0xEF, 0xAF, 0xEF, 0xDF}, /*п*/
/*49*/ {0xD2, 0xF0, 0xE0, 0xF0, 0xE0}, /*р*/
/*50*/ {0xD3, 0xF1, 0xE1, 0xF1, 0xE1}, /*с*/
/*51*/ {0xD4, 0xF2, 0xE2, 0xF2, 0xE2}, /*т*/
/*52*/ {0xD5, 0xF3, 0xE3, 0xF3, 0xE3}, /*у*/
/*53*/ {0xC6, 0xF4, 0xE4, 0xF4, 0xE4}, /*ф*/
/*54*/ {0xC8, 0xF5, 0xE5, 0xF5, 0xE5}, /*х*/
/*55*/ {0xC3, 0xF6, 0xE6, 0xF6, 0xE6}, /*ц*/
/*56*/ {0xDE, 0xF7, 0xE7, 0xF7, 0xE7}, /*ч*/
/*57*/ {0xDB, 0xF8, 0xE8, 0xF8, 0xE8}, /*ш*/
/*58*/ {0xDD, 0xF9, 0xE9, 0xF9, 0xE9}, /*щ*/
/*59*/ {0xDF, 0xFA, 0xEA, 0xFA, 0xEA}, /*ъ*/
/*60*/ {0xD9, 0xFB, 0xEB, 0xFB, 0xEB}, /*ы*/
/*61*/ {0xD8, 0xFC, 0xEC, 0xFC, 0xEC}, /*ь*/
/*62*/ {0xDC, 0xFD, 0xED, 0xFD, 0xED}, /*э*/
/*63*/ {0xC0, 0xFE, 0xEE, 0xFE, 0xEE}, /*ю*/
/*64*/ {0xD1, 0xFF, 0xEF, 0xDF, 0xEF}, /*я*/
/*65*/ {0xB3, 0xA8, 0xF0, 0xDD, 0xA1}, /*Ё*/
/*66*/ {0xA3, 0xB8, 0xF1, 0xDE, 0xF1}, /*ё*/
/*67*/ {0x00, 0xAB, 0x00, 0xC7, 0x00}, /*<<*/
/*68*/ {0x00, 0xBB, 0x00, 0xC8, 0x00}, /*>>*/
/*69*/ {0x23, 0xB9, 0xFC, 0xDC, 0xF0}, /*№*/
/*70*/ {0x00, 0x96, 0x00, 0xD0, 0x00}, /*- короткое тире*/
/*71*/ {0x80, 0x97, 0xC4, 0xD1, 0x00}, /*- длинное тире или —*/
/*72*/ {0x9A, 0xA0, 0xFF, 0xCA, 0xA0}, /* неразрываемый пробел*/
/*73*/ {0x81, 0x00, 0xB3, 0x00, 0x00}, /*і*/
/*74*/ {0xA1, 0x00, 0xBA, 0x00, 0x00}, /*є*/
/*75*/ {0xA0, 0x00, 0xCD, 0x00, 0x00}, /*Н*/
/*76*/ {0x84, 0x00, 0xDA, 0x00, 0x00}, /*Ъ*/
/*77*/ {0x86, 0x00, 0xC3, 0x00, 0x00}, /*Г*/
/*78*/ {0x82, 0x00, 0xC0, 0x00, 0x00}, /*А*/
/*79*/ {0xAB, 0x00, 0xC9, 0x00, 0x00}, /*Й*/
/*80*/ {0xB1, 0x00, 0xCC, 0x00, 0x00}, /*М*/
/*81*/ {0xA5, 0x00, 0xC8, 0x00, 0x00}, /*И*/
/*82*/ {0xAA, 0x00, 0xD6, 0x00, 0x00}, /*Ц*/
/*83*/ {0xB0, 0x00, 0xC7, 0x00, 0x00}, /*З*/
/*84*/ {0xA4, 0x00, 0xD3, 0x00, 0x00}, /*У*/
/*85*/ {0xA9, 0x00, 0xD5, 0x00, 0x00}, /*Х*/
/*86*/ {0xAF, 0x00, 0xC6, 0x00, 0x00}, /*Ж*/
/*87*/ {0xA2, 0x00, 0xD4, 0x00, 0x00}, /*Ф*/
/*88*/ {0x89, 0x00, 0xC2, 0x00, 0x00}, /*В*/
/*89*/ {0x8A, 0x00, 0xC5, 0x00, 0x00}, /*Е*/
/*90*/ {0x88, 0x00, 0xC1, 0x00, 0x00}, /*Б*/
/*91*/ {0xBB, 0x00, 0xCB, 0x00, 0x00}, /*Л*/
/*92*/ {0xBE, 0x00, 0xCE, 0x00, 0x00}, /*О*/
/*93*/ {0xB8, 0x00, 0xCA, 0x00, 0x00}, /*К*/
/*94*/ {0xBA, 0x00, 0xD2, 0x00, 0x00}, /*Т*/
/*95*/ {0xBD, 0x00, 0xD7, 0x00, 0x00}, /*Ч*/
/*96*/ {0xB7, 0x00, 0xD0, 0x00, 0x00}, /*Р*/
/*97*/ {0xB9, 0x00, 0xD1, 0x00, 0x00}, /*С*/
/*98*/ {0xBC, 0x00, 0xD8, 0x00, 0x00}, /*Ш*/
/*99*/ {0xB6, 0x00, 0xCF, 0x00, 0x00}, /*П*/
/*100*/ {0x85, 0x00, 0xBF, 0x00, 0x00}, /*ї*/
/*101*/ {0x87, 0x00, 0xB4, 0x00, 0x00}, /*ґ*/
/*102*/ {0x83, 0x00, 0xD9, 0x00, 0x00}, /*Щ*/
/*103*/ {0xAE, 0x00, 0xBB, 0x00, 0x00}, /*»*/
/*104*/ {0xB5, 0x00, 0xB9, 0x00, 0x00}, /*№*/
/*105*/ {0xA8, 0x00, 0xBC, 0x00, 0x00}, /*ј*/
/*106*/ {0xAD, 0x00, 0xB7, 0x00, 0x00}, /*·*/
/*107*/ {0xB4, 0x00, 0xB6, 0x00, 0x00}, /*¶*/
/*108*/ {0xA7, 0x00, 0xBD, 0x00, 0x00}, /*Ѕ*/
/*109*/ {0xAC, 0x00, 0xB8, 0x00, 0x00}, /*ё*/
/*110*/ {0xB2, 0x00, 0xB5, 0x00, 0x00}, /*µ*/
/*111*/ {0xA6, 0x00, 0xBE, 0x00, 0x00} /*ѕ*/
};

#pragma warning(default : 4305)
#pragma warning(default : 4309)

/******************************************************************
* Функция перекодировки строки из одной кодировки кириллицы в *
* другую (перекодировка выполняется в исходном буфере). *
* *
* lpSt - строка, nSrcCP - исходная кодировка, nDestCP - выходная *
* кодировка (кодировки: CPKOI8 ... CPISO) *
* *
******************************************************************/
void RecodeString(LPTSTR lpSt, int nSrcCP, int nDestCP)
{
if (nSrcCP == nDestCP) return;

int nSize = lstrlen(lpSt);

if (!nSize) return;

if ((nSrcCP < CPKOI8) || (nSrcCP > CPISO)) return;
if ((nDestCP < CPKOI8) || (nDestCP > CPISO)) return;

for (int i = 0; i < nSize; i ++)
{
if ((unsigned char)lpSt[i] > 127)
{
for (int j = 0; j < SYMBOLSNUM; j++)
{
if (EncodingTable[j][nSrcCP] == (unsigned char)lpSt[i])
{
lpSt[i] = EncodingTable[j][nDestCP];
break;
}
}
}
}

return;
}

 

 


Лицензия Creative Commons   Яндекс.Метрика