当前位置:首页 > 公众号精选 > 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
声明:本文仅代表作者本人观点,不代表本站观点,如有问题请联系站方处理。
换一批
延伸阅读

上海2022年5月25日 /美通社/ -- 近日,国际独立第三方检测、检验和认证机构德国莱茵TUV大中华区(以下简称“TUV莱茵”)携手英国建筑研究院(BRE),为上海建科集...

关键字: 照明系统 PERFORMANCE 能源管理 GB

4项关键性临床试验数据继续为百悦泽®(泽布替尼)治疗B细胞恶性肿瘤提供证据支持 BCL-2抑制剂BGB-11417作为单药治疗和与泽布替尼联合用药的早期数据显示管线的有力前景 中国北京、美国麻省剑桥和瑞士巴塞...

关键字: 管线 神州 BSP GB

北京2022年4月6日 /美通社/ -- 日前,亚马逊云科技持续增强Serverless计算服务功能,将Amazon Lambda函数可用的临时存储空间提升20倍,从512MB增加至10,240 MB。该功能将帮助客户更...

关键字: 亚马逊 GB

(全球TMT2022年4月6日讯)日前,亚马逊云科技持续增强Serverless计算服务功能,将Amazon Lambda函数可用的临时存储空间提升20倍,从512MB增加至10,240 MB。该功能将帮助客户更轻松地...

关键字: 亚马逊 GB

北京2022年3月25日 /美通社/ -- 近日,政府数字化转型如火如荼推进,各类信息化软硬件工具不断发布。浪潮政务自动化辅助机器人(GBOT)助力一地方政府数字化转型。数字赋能,减时限、减跑腿、减材料,窗口外,办事人办...

关键字: GB 自动化 机器人

1、AHB系统总线分为APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速设备。2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf....

关键字: STM32 电平 FSMC GB

100多年来,人类从简单的电报通信发展到如今的5G通信,生活发生了翻天覆地的变化,直播、VR/AR、超清视频会议、远程医疗、自动驾驶和智能家居等应用越来越广泛。而所有这些,都需要基于高速的数据传输。因为高速信号在铜缆中迅...

关键字: 光通信 光模块 GB 封装

1.读取UTF-8编码文本原理首先了解UTF-8的编码方式,UTF-8采用可变长编码的方式,一个字符可占1字节-6字节,其中每个字符所占的字节数由字符开始的1的个数确定,具体的编码方式如下:U-00000000–U-00...

关键字: GB

本篇内容,纯属虚构!如有雷同,纯属巧合!1、为什么10月24日会是程序员节?   A:不知道  B:1024MB=1GB约等于一级棒,程序员No.1  C:纯凑热闹点击下方空白区域查看答案▼「答案:B」 对于程序员来说,...

关键字: GB

本篇内容,纯属虚构!如有雷同,纯属巧合!1、为什么10月24日会是程序员节?   A:不知道  B:1024MB=1GB约等于一级棒,程序员No.1  C:纯凑热闹点击下方空白区域查看答案▼「答案:B」 对于程序员来说,...

关键字: GB

C语言与CPP编程

249 篇文章

关注

发布文章

编辑精选

技术子站

关闭