各种编码方式可能涉及到的读取问题,以下函数或内部使用函数供参考
1、是否utf8
bool IsTextUTF8(const char* str, long length)
{
unsigned char chr;
int nBytes = 0; // UFT8可用1-6个字节编码,ASCII用一个字节
bool bAllAscii = true; // 如果全部都是ASCII, 说明不是UTF-8
for (int i=0; i < length; i++)
{
chr = *(str + i);
if ((chr&0x80) != 0) // 判断是否ASCII编码,如果不是,说明有可能是UTF-8, ASCII用7位编码,但用一个字节存,最高位标记为0,o0xxxxxxx
{
bAllAscii = false;
}
if (nBytes == 0) // 如果不是ASCII码,应该是多字节符,计算字节数
{
if (chr >= 0x80)
{
if (chr>=0xFC && chr<=0xFD)
nBytes = 6;
else if (chr>=0xF8)
nBytes = 5;
else if (chr>=0xF0)
nBytes = 4;
else if (chr>=0xE0)
nBytes = 3;
else if (chr>=0xC0)
nBytes = 2;
else
return false;
nBytes--;
}
}
else // every char of ascii buffer looks like 10xxxxxx, except the first char
{
if( (chr&0xC0) != 0x80 )
{
return false;
}
nBytes--;
}
}
if (nBytes > 0) // format error
{
return false;
}
if (bAllAscii) // if all chars are ascii, the buffer is not utf-8
{
return false;
}
return true;
}
2、utf8转为多字节字符
string UTF8ToGB(const char* str)
{
string result;
WCHAR *strSrc;
LPSTR szRes;
//获得临时变量的大小 该函数映射一个字符串到一个宽字符(unicode)的字符串
int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
strSrc = new WCHAR[i + 1];
MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);
//获得临时变量的大小 该函数可以映射一个unicode字符串到一个多字节字符串
i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
szRes = new CHAR[i + 1];
WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
result = szRes;
delete[]strSrc;
delete[]szRes;
return result;
}