首先得到ISO8859-2和unicode的字符对照表,如下:
static const unsigned short iso8859_2_2uni[96] = {
/* 0xa0 */
0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7,
0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b,
/* 0xb0 */
0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7,
0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c,
/* 0xc0 */
0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
/* 0xd0 */
0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
/* 0xe0 */
0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
/* 0xf0 */
0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9,
};
int gStringToUnicode(LPBYTE lString)
{
int nLength = 0;
nLength = strlen((LPCSTR) lString);
if (nLength < 1)
return 0;
char *tempString = new char[nLength];
memset(tempString, NULL, nLength);
memcpy(tempString, lString, nLength);
WCHAR wchr[1] = L"";
for (int i=0; i < (nLength*2); i+=2)
{
if ((BYTE)lString[i] > 0x9F)//The special character of 8859-2 start from 0xA0
{
//8859-2 the same with 3,4,5,6,7,8, but comparison table is different.
//Here is only 8859-2 comparison table with unicode
wchr[0] = iso8859_2_2uni[(BYTE)lString[i]-0xA0];
char chr[2] = {0};
memcpy(chr, wchr, 2);
tempString[i] = chr[0];
tempString[i+1] = chr[1];
}
else
{
tempString[i] = lString[i];
tempString[i+1] = 0x00;
}
}
memcpy(lString, tempString, nLength);
return nLength;
}