当前位置: 首页 > news >正文

获取UTF8编码文本长度, 检测符合UTF8编码

// 
// @brief: 获取UTF8字符个数
// @param: strContent   文本内容
// @ret: int 若返回值 >= 0, 表示字符个数, 若返回值 < 0, 表示文本内容不是合法的 UTF8 编码字符串
int GetUtf8CharacterCount(const std::string& strContent)
{bool fResult = true;    // 操作结果bool fBom = true;       // BOM(Byte Order Mark)int nByteCount = 0;     // 字节计数int nChCount = 0;       // 字符计数for (const unsigned char ch: strContent){// 普通 Ascii 也是utf8一部分if (ch < 0x7F){nChCount++;continue;}// 检查 UTF-8 首字节if (0 == nByteCount){if (ch >= 0xC0){uint8_t u8CodeMask  = 0xC0;     // 11000000uint8_t u8DataMask = 0x1F;      // 000xxxxxint nCount = 2;                 // 有效字节数量: 2-6// 检索字符使用的字节数量while(u8CodeMask <= 0xFC){uint8_t u8MaskMax = u8CodeMask | u8DataMask;if (ch >= u8CodeMask && ch <= u8MaskMax){nByteCount = nCount;break;}u8CodeMask = (u8CodeMask >> 1) | 0x80;u8DataMask = u8DataMask >> 1;nCount++;}if (0 == nByteCount){fResult = false;break;}if (0xEF == ch && 3 == nByteCount){fBom = true;}nByteCount--;}else{fResult = false;break;}}else{// 非首字节掩码: 10xxxxxxif (0x80 != (ch & 0xC0)){fResult = false;break;}if (fBom){if (0xBB != ch && 2 == nByteCount){fBom = false;}if (0xBF != ch && 1 == nByteCount){fBom = false;}}nByteCount--;if (0 == nByteCount){if (!fBom){nChCount++;}fBom = false;}}}if (!fResult){return -1;}return nChCount;
}
#include <iostream>
#include <fstream>int main(int argc, char* argv[])
{std::string strContent = u8"1234567890汉字编码";int uCount = GetUtf8CharacterCount(strContent);return 0;
}


http://www.mrgr.cn/news/48817.html

相关文章:

  • 云计算ftp 服务器实验
  • 量化交易理论:凯利公式和仓位管理
  • 如何选择安全的谷歌浏览器插件
  • 关于Linux下C++程序内存dump的分析和工具
  • Samtools手册中文版
  • FreeRTOS学习笔记(更新中更新时间2024.10.12)
  • 智能化时代,企业管理疑难杂症就问“中聚AI”
  • 基于深度学习的心电图分类算法研究
  • DS线性表之单链表的讲解和实现(2)
  • 290. 单词规律【哈希表】
  • [论文笔记] Let‘s Verify Step by Step
  • 【MySQL 保姆级教学】数据库基础(重点)(2)
  • 数智化技术:破解新型电力系统世界级难题的金钥匙
  • 渗透测试 之 AD域渗透 【AS-REP Roasting】 攻击技术详解
  • 【笔记】Day2.5.1查询运费模板列表(未完
  • win软件 超强的本地视频 图片去水印 动态水印!
  • vue面试题
  • 【网络协议】TCP协议常用机制——延迟应答、捎带应答、面向字节流、异常处理,保姆级详解,建议收藏
  • 垂直AI大模型行业全景分析及发展趋势研究报告
  • Linux(三):文件比较利器——vimdiff与vim -d