UTF8是以8bits即1Bytes为编码的最基本单位,当然也可以有基于16bits和32bits的形式,分别称为UTF16和UTF32,但目前用得不多,而UTF8则被广泛应用在文件储存和网络传输中。
编码原理
先看这个模板:
UCS-4 range (hex.) UTF-8 octet sequence (binary)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-001F FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx
编码步骤:
1) 首先确定需要多少个8bits(octets)
2) 按照上述模板填充每个octets的高位bits
3) 把字符的bits填充至x中,字符顺序:低位→高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x
根据UTF8编码,最多可由6个字节组成,所以UTF8是1-6字节编码组成
C++代码如下:
int IsTextUTF8(char* str,ULONGLONG length)
{
int i;
DWORD nBytes=0;//UFT8可用1-6个字节编码,ASCII用一个字节
UCHAR chr;
BOOL bAllAscii=TRUE; //如果全部都是ASCII, 说明不是UTF-8
for(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 //多字节符的非首字节,应为 10xxxxxx
{
if( (chr&0xC0) != 0x80 )
{
return FALSE;
}
nBytes--;
}
}
if( nBytes > 0 ) //违返规则
{
return FALSE;
}
if( bAllAscii ) //如果全部都是ASCII, 说明不是UTF-8
{
return FALSE;
}
return TRUE;
}
分享到:
相关推荐
本文实例讲述了C++实现判断一个字符串是否为UTF8或GBK格式的方法。分享给大家供大家参考,具体如下: 在处理外部数据的时候,很可能因为数据格式不一样而导致乱码,甚至导致某些程序挂掉。鉴于对多数系统来说,使用...
可实现三种功能: (1)判断一整个字符串是否为回文; (2)判断指定位置的子串是否为回文; (3)输出此字符串中最长的子字符串;
很多人喜欢用CString 或std:string,但是他们的缺点是不能完成汉字各种类型之间的转换,提供三种类库ascString,ucsString,utfString以及工具utfCount,utf8_ucs2_t,tcf8_ucs4_t类库,用于各种字符串之间的直接转换`...
本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考。具体分析如下: 我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用。 一、用strtok函数进行字符串分割 原型: char *...
两个C++类:UTF8自动转换至Unicode,Unicode自动转换至UTF8
C++ 语言中关于字符串编程。字符串中查找字符串。。。。
通过键盘输入一串小写字母(a~z)组成的字符串,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。 要求实现...
字符编码笔记:ASCII-Unicode和UTF-8 字符编码笔记:ASCII-Unicode和UTF-8 字符编码笔记:ASCII-Unicode和UTF-8
详解C++中十六进制字符串转数字(数值) 主要有两个方法,其实都是对现有函数的使用: 方法1: sscanf() 函数名: sscanf 功 能: 从字符串格式化输入 用 法: int sscanf(char *string, char *format[,...
ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的C++代码ASCII_UNICODE_UTF8字符串互相转换的...
C++字符串完全指引之一 Win32 字符编码 C++字符串完全指引之二 字符串封装类 详细介绍了c++字符编码和字符串相关类
本程序判断字符串是否中心对称,绝对可用!
string常用截取字符串方法有很多,但是配合使用以下两种,基本都能满足要求: find(string strSub, npos); ...例1:直接查找字符串中是否具有某个字符串(返回”2″) std::string strPath = E:\\
判断字符编码格式代码,用C++编写的如何判断字符编码格式,UTF-8,ASCII等
用C++(的文件操作)编写一程序从文本文件中读入若干个字符串(每个串长度不超过80个字符),将字符串按字典序(从小到大)排序,结果输出到另一个正文文件中。希望此程序能处理任意多个字符串
116、1298:计算字符串距离--2020.04.09a.pdf
执行UTF8string基于标准C ++库提供的std :: string ,但已实现为支持UTF-8编码的字符串。 某些功能已针对utf8字符串进行了修改: utf8_length:获取字符串中的字符数(代码点数)。 utf8_size:获取获取字符串的内存...
utf-8、ANSI、Unicode相互转化c++实现 std::string ConverANSI2UTF8(const std::string & str); std::wstring ConverANSI2Unicode(const std::string str); std::wstring ConverUTF82Unicode(const std::string str)...
c++读取解析Json字符串内容