`
hcmfys
  • 浏览: 357794 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

C++实例:判断字符串是否UTF8编码

阅读更多
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格式的方法

    下面是一个判断字符串是否为utf8的函数: bool is_str_utf8(const char* str) { unsigned int nBytes = 0;//UFT8可用1-6个字节编码,ASCII用一个字节 unsigned char chr = *str; bool bAllAscii = t

    字符串项目2021年

    C++标准库默认使用UTF-8编码,但你也可以使用其他编码,如ISO-8859-1或GBK,不过这通常需要额外的库支持。 最后,`std::string`与C风格的字符数组(char数组)之间可以方便地转换。`c_str()`方法将`std::string`...

    软件基础学习总结

    判断字符串的编码格式 程序需要能够判断输入字符串的编码格式,以便正确处理字符数据。 #### 6. 编码转换 - **Unicode之间的转换**:在Unicode编码与本地编码(如GB2312、GBK)之间进行转换。 - **iconv函数**:...

    日志类 C++

    在C++中,这可以通过使用宽字符(wchar_t)和宽字符串(wstring)或者使用UTF-8编码来实现。 4. **灵活的日志路径和名称**:日志类应提供接口,允许用户自定义日志文件的保存位置和命名方式。这可能包括指定日志...

    UE基础面试,比较难回答的问题\字符串\代理\容器等

    UE支持不同字符集之间的转换,如`FString::FromUTF8()`用于从UTF-8转换到UE内部格式。 #### 八、代理模式应用 **8.1 代理模式** 代理模式在UE中常用于实现异步操作,如异步加载资源、网络通信等。 **8.2 类型...

    testQString2.zip

    这个"testQString2"可能是一个练习项目或教程,包含了使用QString的各种实例,例如创建、修改、比较字符串,进行正则匹配,以及在实际场景中的应用。通过学习和实践这些例子,开发者能够深入理解QString的功能和用法...

    Java Native Interface 6.0 Specification (JNI) 原创PDF书签

    JNI函数包括接口函数表、版本信息、类操作、类的定义、获取超类、判断...判断是否为同一个对象、访问对象字段、获取字段ID、获取字段值、设置字段值、调用实例方法、访问静态字段、获取静态字段ID、获取静态字段值、...

    ascii.zip_If..._ascii

    8. **实际编程示例**:PDF可能包含使用ASCII码进行字符串操作或数据解析的编程实例,比如Python、Java或C++代码。 通过学习这份ASCII的PDF文档,读者不仅可以了解ASCII的基本概念,还能掌握如何在实际编程中有效地...

    2021-2022计算机二级等级考试试题及答案No.14120.docx

    5. 字符类型判断:在C/C++等语言中,判断字符`c`是否为小写字母,正确的表达式是`(c&gt;='a')&&(c)`。 6. JRE与JDK的区别:JRE是Java运行时环境,包含运行Java程序所需的基本组件;JDK是Java开发工具包,除了JRE还包括...

    官方python3教程

    - **源程序编码:** 支持多种字符编码,如UTF-8。 - **交互执行文件:** 可以在交互模式下加载并执行文件。 - **本地化模块:** 支持不同语言和地区的本地化设置。 #### 三、Python基础 **3.1 将Python当作计算器*...

    简繁体字转换的代码

    确保你的输入和输出字符串使用相同的编码,例如UTF-8或GBK,以避免乱码问题。此外,不同的转换库可能对Unicode编码的支持程度不同,因此在实际应用中要特别注意。 总结起来,简繁体字转换是通过调用DLL中的静态函数...

    经典Python面试题之Python基础篇.docx

    - **search**: 搜索整个字符串中是否有匹配模式。 #### 38. 正则表达式的贪婪匹配? - 默认情况下,正则表达式尝试匹配尽可能多的字符。 #### 39. 求结果 - **a**: `[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]` - **b**: ...

    VC++从EML文档或txt中提取出Email邮件地址

    - 在实际应用中,还需要考虑编码问题,如UTF-8或GBK,因为文件可能包含非ASCII字符。 - 虽然上述代码可以找到大部分电子邮件地址,但它可能无法捕获所有复杂情况,例如带有引号或特殊字符的地址。使用正则表达式...

    C# 面向对象程序设计

    - **编码方式**:如ASCII、UTF-8等不同的字符编码格式。 - **项目1:HelloWorld文件流操作**:演示如何创建文件、写入内容以及读取文件中的数据。 - **项目2:创建一个简单的Windows记事本**:使用C#实现基本的...

    java面试题目,超级经典的,很有挑战性

    28. char变量可以存储一个中文汉字,因为UTF-16编码中一个字符可能占用两个字节。 29. **GC**(Garbage Collector)是Java的自动内存管理机制,用于回收不再使用的对象所占的内存。 30. `float f = 3.4f;`是正确的,...

Global site tag (gtag.js) - Google Analytics