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;
}
分享到:
相关推荐
下面是一个判断字符串是否为utf8的函数: bool is_str_utf8(const char* str) { unsigned int nBytes = 0;//UFT8可用1-6个字节编码,ASCII用一个字节 unsigned char chr = *str; bool bAllAscii = t
C++标准库默认使用UTF-8编码,但你也可以使用其他编码,如ISO-8859-1或GBK,不过这通常需要额外的库支持。 最后,`std::string`与C风格的字符数组(char数组)之间可以方便地转换。`c_str()`方法将`std::string`...
判断字符串的编码格式 程序需要能够判断输入字符串的编码格式,以便正确处理字符数据。 #### 6. 编码转换 - **Unicode之间的转换**:在Unicode编码与本地编码(如GB2312、GBK)之间进行转换。 - **iconv函数**:...
在C++中,这可以通过使用宽字符(wchar_t)和宽字符串(wstring)或者使用UTF-8编码来实现。 4. **灵活的日志路径和名称**:日志类应提供接口,允许用户自定义日志文件的保存位置和命名方式。这可能包括指定日志...
UE支持不同字符集之间的转换,如`FString::FromUTF8()`用于从UTF-8转换到UE内部格式。 #### 八、代理模式应用 **8.1 代理模式** 代理模式在UE中常用于实现异步操作,如异步加载资源、网络通信等。 **8.2 类型...
这个"testQString2"可能是一个练习项目或教程,包含了使用QString的各种实例,例如创建、修改、比较字符串,进行正则匹配,以及在实际场景中的应用。通过学习和实践这些例子,开发者能够深入理解QString的功能和用法...
JNI函数包括接口函数表、版本信息、类操作、类的定义、获取超类、判断...判断是否为同一个对象、访问对象字段、获取字段ID、获取字段值、设置字段值、调用实例方法、访问静态字段、获取静态字段ID、获取静态字段值、...
8. **实际编程示例**:PDF可能包含使用ASCII码进行字符串操作或数据解析的编程实例,比如Python、Java或C++代码。 通过学习这份ASCII的PDF文档,读者不仅可以了解ASCII的基本概念,还能掌握如何在实际编程中有效地...
5. 字符类型判断:在C/C++等语言中,判断字符`c`是否为小写字母,正确的表达式是`(c>='a')&&(c)`。 6. JRE与JDK的区别:JRE是Java运行时环境,包含运行Java程序所需的基本组件;JDK是Java开发工具包,除了JRE还包括...
- **源程序编码:** 支持多种字符编码,如UTF-8。 - **交互执行文件:** 可以在交互模式下加载并执行文件。 - **本地化模块:** 支持不同语言和地区的本地化设置。 #### 三、Python基础 **3.1 将Python当作计算器*...
确保你的输入和输出字符串使用相同的编码,例如UTF-8或GBK,以避免乱码问题。此外,不同的转换库可能对Unicode编码的支持程度不同,因此在实际应用中要特别注意。 总结起来,简繁体字转换是通过调用DLL中的静态函数...
- **search**: 搜索整个字符串中是否有匹配模式。 #### 38. 正则表达式的贪婪匹配? - 默认情况下,正则表达式尝试匹配尽可能多的字符。 #### 39. 求结果 - **a**: `[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]` - **b**: ...
- 在实际应用中,还需要考虑编码问题,如UTF-8或GBK,因为文件可能包含非ASCII字符。 - 虽然上述代码可以找到大部分电子邮件地址,但它可能无法捕获所有复杂情况,例如带有引号或特殊字符的地址。使用正则表达式...
- **编码方式**:如ASCII、UTF-8等不同的字符编码格式。 - **项目1:HelloWorld文件流操作**:演示如何创建文件、写入内容以及读取文件中的数据。 - **项目2:创建一个简单的Windows记事本**:使用C#实现基本的...
28. char变量可以存储一个中文汉字,因为UTF-16编码中一个字符可能占用两个字节。 29. **GC**(Garbage Collector)是Java的自动内存管理机制,用于回收不再使用的对象所占的内存。 30. `float f = 3.4f;`是正确的,...