资源简介
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
- 上一篇:51单片机-光立方-C语言
- 下一篇:如何在VC++ 6.0创建RTX项目
相关资源
- 如何在VC++ 6.0创建RTX项目
- visualc++下位机温度测量串口通信与实
- c++写的OpenGL程序透明金字塔有加上光
- C++二叉树基于Mfc的程序开发
- C++ blackjack经典21点小游戏 课程设计
- 多用户多级目录文件系统c++源码(含
- libstdc++.so.6.0.22 or GLIBCXX_3.4.22 in tenso
- visual c++ 6.0 完整扫雷源代码
- 数据结构算法与应用 c++语言描述(第
- c++之sha1类
- 信息学奥赛NOIP系列课程之C++部分课程
- VC++ 实现将本地文件通过HTTP上传到网
- PCA融合算法C++代码
- c++版遗传算法基本算法
- VC++采用内存映射方式高效率读写大数
- 页面置换算法OPT、FIFO、LRU实现--C++版
- 分支限界法求圆排列问题
- http 协议解析类 c++
- 用C++语言写的完整的人脸识别程序源
-
mfc通过xm
l文件生成word文档 - 哈夫曼最小生成树及最短路径代码
- C++写的多级反馈队列代码
- c++读取ini文件封装类
- ECC加密 RSA加密 C++ 简单实现 不带大数
- c++实现的录音程序源代码(录mp3、x
- 校园导航系统 c++做的 !
- 值得你看的C++27个趣味程序
- c++学生选课系统代码
- C++五子棋源代码程序解析
- 操作系统课程设计之进程调度源代码
评论
共有 条评论