• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-22
  • 语言: C/C++
  • 标签: UTF8  C++  

资源简介

utf8编码解码的纯C++代码 仅在Visual Studio 2005 /2010 调试通过 将utf8字节流解码为宽字符(wchar_t)时,结果的正确性依赖于sizeof(wchar_t) 具体来说就是wchar_t是否有足够的空间容纳 UNICODE码

资源截图

代码片段和文件信息

#include “Coding.h“

using namespace Text;

#pragma warning ( disable: 4333)

namespace _utf8_
{
void encode(const wchar_t * strunsigned long strlen unsigned char * buffer )
{
while( strlen > 0 )
{
if( *str < 0x80 ) //0xxxxxxx
{
*buffer =(unsigned char)*str;
buffer++;
}
else if( *str<0x0800) //双字节模板 110xxxxx 10xxxxxx
{
*buffer = ( *str >> 6   | 0xc0 );
buffer[1] = ( *str & 0x3f | 0x80 );
buffer+=2;
}
else if( *str < 0x010000 ) //三字节模板 1110xxxx 10xxxxxx 10xxxxxx
{
*buffer = ( *str >> 12         | 0xe0);
buffer[1] = ( *str >> 6  & 0x3f  | 0x80);
buffer[2] = ( *str & 0x3f        | 0x80);
buffer+=3;
}
else if ( *str < 0x200000 ) //四字节模板 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
{
*buffer = (*str >> 18        | 0xf0);
buffer[1] = (*str >> 12 & 0x3f | 0x80);
buffer[2] = (*str >> 6  & 0x3f | 0x80);
buffer[3] = (*str & 0x3f       | 0x80);
buffer+=4;
}
else if ( *str < 0x04000000) //五字节模板 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
{
*buffer = ( *str>>24  | 0xf8 );
buffer[1] = ( *str>>18 & 0x3f | 0x80 );
buffer[2] = ( *str>>12 & 0x3f | 0x80 );
buffer[3] = ( *str>>6  & 0x3f | 0x80 );
buffer[4] = ( *str &0x3f      | 0x80 );
buffer+=5;
}
else                       //六字节模板 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
{
*buffer = ( *str>>30  | 0xfc );
buffer[1] = ( *str>>24 & 0x3f | 0x80 );
buffer[2] = ( *str>>18 & 0x3f | 0x80 );
buffer[3] = ( *str>>12 & 0x3f | 0x80 );
buffer[4] = ( *str>>6  & 0x3f | 0x80 );
buffer[5] = ( *str &0x3f      | 0x80 );
buffer+=6;
}

strlen -- ;
str++;
}
}

bool count_force(const unsigned char * bytes unsigned long bytes_lenunsigned long &count)
{
if( bytes == 0 )
{
return false;
}
unsigned long tmpcount=0;
while( bytes_len > 0 )
{
if( *bytes < 0x80 ) //0xxxxxxx
{
bytes++;
bytes_len --;
}
else if (  ((*bytes) >> 5) ==6 ) //110xxxxx 10xxxxxx
{
if(bytes_len >1 && bytes[1]>>6 == 2 )
{
bytes+=2;
bytes_len -=2;
}
}
else if ( ((*bytes) >> 4) == 14 ) //1110xxxx 10xxxxxx 10xxxxxx
{
if( bytes_len >2 &&  bytes[1]>>6==2 && bytes[2]>>6==2 )
{
bytes+=3;
bytes_len -=3;
}
}
else if ( ((*bytes) >> 3) == 30 ) //11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
{
if(  bytes_len >3 && bytes[1]>>6==2 && bytes[2]>>6==2 && bytes[3]>>6==2 )
{
bytes+=4;
bytes_len -=4;
}
}
else if ( ((*bytes) >> 2) == 62 ) //111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
{
if( bytes_len >4 &&  bytes[1]>>6==2 && bytes[2]>>6==2 && bytes[3]>>6==2 && bytes[4]>>6==2 )
{
bytes+=5;
bytes_len -=5;
}
}
else if ( ((*bytes) >> 1) == 126 ) //1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
{
if( bytes_len >5 &&  bytes[1]>>6==2 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       8984  2013-07-10 17:20  Coding.cpp

     文件       2487  2013-07-10 18:20  Coding.h

----------- ---------  ---------- -----  ----

                11471                    2


评论

共有 条评论