当前位置:首页 > 公众号精选 > C语言与CPP编程
[导读]1.读取UTF-8编码文本原理首先了解UTF-8的编码方式,UTF-8采用可变长编码的方式,一个字符可占1字节-6字节,其中每个字符所占的字节数由字符开始的1的个数确定,具体的编码方式如下:U-00000000–U-0000007F:0xxxxxxxU-00000080–U-00...

1.读取 UTF-8 编码文本原理
首先了解 UTF-8 的编码方式,UTF-8 采用可变长编码的方式,一个字符可占 1 字节 -6 字节,其中每个字符所占的字节数由字符开始的 1 的个数确定,具体的编码方式如下:
U-00000000 – U-0000007F: 0xxxxxxxU-00000080 – U-000007FF: 110xxxxx 10xxxxxxU-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxxU-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxU-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxU-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx因此,对于每个字节如果起始位为“0”则说明,该字符占有 1 字节。

如果起始位为“10”则说明该字节不是字符的其实字节。

如果起始为为 n 个“1” 1个“0”,则说明改字符占有 n 个字节。其中1≤n≤6。

因此对于 UTF-8 的编码,我们只需要每次计算每个字符开始字节的 1 的个数,就可以确定这个字符的长度。

GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;background-color: rgb(255, 255, 255);color: rgb(34, 34, 34);border-bottom: 1px solid rgb(238, 238, 238);line-height: 1.75em;box-sizing: border-box !important;overflow-wrap: break-word !important;">2.读取 GBK 系列文本原理

对于 ASCII、GB2312、GBK 到 GB18030 编码方法是向下兼容的 ,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。

在这些编码中,英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为 0。

因此我们只需处理好 GB18130,就可以处理与他兼容的所有编码,对于GB18130 使用双字节变长编码。

单字节部分从 0×0~0x7F 与 ASCII 编码兼容。双字节部分,首字节从 0×81~0xFE,尾字节从 0×40~0x7E以及 0×80~0xFE,与 GBK 标准基本兼容。

因此只需检测首字节是否小于 0×81 即可确定其为单字节编码还是双字节编码。

GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;white-space: normal;background-color: rgb(255, 255, 255);color: rgb(34, 34, 34);border-bottom: 1px solid rgb(238, 238, 238);line-height: 1.75em;box-sizing: border-box !important;overflow-wrap: break-word !important;">3.C 代码实现

对于一个语言处理系统,读取不同编码的文本应该是最基础的需求,文本的编码方式应该对系统其他调用者透明,只需每次获取一个字符即可,而不需要关注这个文本的编码方式。从而我们定义了抽象类 Text,及其接口ReadOneChar,并使两个文本类 GbkText 和 UtfText 继承这个抽象类,当系统需要读取更多种编码的文件时,只需要定义新的类然后继承该抽象类即可,并不需要更改调用该类的代码。从而获得更好的扩展性。

更好的方式是使用简单工厂模式,使不同的文本编码格式对于调用类完全透明,简单工厂模式详解请参看:设计模式:可复用面向对象软件基础


其中 Text 抽象类的定义如下:
#ifndef TEXT_H#define TEXT_H#include #include using namespace std;class Text{ protected: char * m_binaryStr; size_t m_length; size_t m_index; public: Text(string path); void SetIndex(size_t index); virtual bool ReadOneChar(string
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

(全球TMT2023年8月30日讯)2023年8月29日,TCL正式在海外发布两款为用户视觉护航的全新手机——TCL 40 NXTPAPER和TCL 40 NXTPAPER 5G,其采用了TCL独家的“未来纸”(NXT...

关键字: TCL 手机 PAPER GB

为了加强北美管理团队,扩大北美市场,HRS任命旅行科技高管Will Pinnell为高级副总裁企业旅行采购专家Pauline Robin为采购咨询与供应商关系副总裁。 德国科隆和纽约2023年8月14日 /美通社/ -...

关键字: RS PI GB BCD

上海2023年2月27日 /美通社/ -- 2月24日,国际独立第三方检测、检验和认证机构德国莱茵TUV大中华区(以下简称"TUV莱茵")为梅菲特(北京)涂料有限公司旗下的都芳植物基环保内墙漆...

关键字: CHINA MARK BSP GB

适合企业备份与虚拟化应用 上海2023年2月20日 /美通社/ -- 存储、网通及运算解决方案的创新厂商威联通®科技 (QNAP®) 推出新款TS-1655桌上型大容量2.5GbE NAS,提供可装载1...

关键字: GB 5G NAS SSD

深圳2023年1月11日 /美通社/ -- 相比消费级硬盘(HDD),消费级固态硬盘(SSD)凭借传输速度快、低功耗、稳定性强、重量轻等优势已成为更主流的选择。但随着PC用户使用场景越来越丰富,日常办公学习、运...

关键字: SSD PC 固态硬盘 GB

北京2022年12月26日 /美通社/ -- 2022年12月25日,CIAA在线举行2022年度CIAA团体标准发布会,向社会公开发布了T/CIAA 103.2-2022《抗菌技术规范 第2部分:防霉/抗真菌产品》、T...

关键字: GB ISO BSP 测试方法

北京2022年12月20日 /美通社/ -- 伴随牛顿力学体系的建立而诞生的近代科学,开辟了一个全新的时代改变了人类的生产生活和思维方式,对人类社会的发展进程产生了深远的、革命性的影响。时至今日,科技创新也依然是影响和改...

关键字: 分布式 节点 带宽 GB

为游客提供全天候互动信息及导游服务 香港2022年12月15日 /美通社/ -- 紧贴世界不断进步的潮流和胍搏,香港大富翁梦想世界™将与诺达科技机械人(Novelte Robotics)携手推出机械人管家服务,在主题体...

关键字: BSP LTE NOVEL GB

厦门2022年12月12日 /美通社/ -- 近日,珍妮花晴雨科技(上海)有限公司(以下简称“珍妮花”)的抗烈风伞(产品型号:ZNHCMKF22-001)获国际独立第三方检测...

关键字: CHINA MARK GB 供应链

11月10日,瑞安办公全新发布可持续创新方案,同时携手LEED 绿色建筑及城市评价体系的创立机构美国绿色建筑委员会(U.S Green Building Council, USGBC)于瑞安广场签署首发办公楼深绿租赁。瑞...

关键字: BUILDING GREEN 空调 GB
关闭