資源簡(jiǎn)介
utf8編碼解碼的純C++代碼
僅在Visual Studio 2005 /2010 調(diào)試通過(guò)
將utf8字節(jié)流解碼為寬字符(wchar_t)時(shí),結(jié)果的正確性依賴(lài)于sizeof(wchar_t)
具體來(lái)說(shuō)就是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)?//雙字節(jié)模板?110xxxxx?10xxxxxx
{
*buffer?=?(?*str?>>?6???|?0xc0?);
buffer[1]?=?(?*str?&?0x3f?|?0x80?);
buffer+=2;
}
else?if(?*str?0x010000?)?//三字節(jié)模板?1110xxxx?10xxxxxx?10xxxxxx
{
*buffer?=?(?*str?>>?12?????????|?0xe0);
buffer[1]?=?(?*str?>>?6??&?0x3f??|?0x80);
buffer[2]?=?(?*str?&?0x3f????????|?0x80);
buffer+=3;
}
else?if?(?*str?0x200000?)?//四字節(jié)模板?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)?//五字節(jié)模板?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???????????????????????//六字節(jié)模板?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?
?屬性????????????大小?????日期????時(shí)間???名稱(chēng)
-----------?---------??----------?-----??----
?????文件???????8984??2013-07-10?17:20??Coding.cpp
?????文件???????2487??2013-07-10?18:20??Coding.h
-----------?---------??----------?-----??----
????????????????11471????????????????????2
評(píng)論
共有 條評(píng)論