C++ UTF-8编解码


icu 编解码数据:
extern const UConverterSharedData
    _MBCSData, _Latin1Data,
    _UTF8Data, _UTF16BEData, _UTF16LEData, _UTF32BEData, _UTF32LEData,
    _ISO2022Data, 
    _LMBCSData1,_LMBCSData2, _LMBCSData3, _LMBCSData4, _LMBCSData5, _LMBCSData6,
    _LMBCSData8,_LMBCSData11,_LMBCSData16,_LMBCSData17,_LMBCSData18,_LMBCSData19,
    _HZData,_ISCIIData, _SCSUData, _ASCIIData,
    _UTF7Data, _Bocu1Data, _UTF16Data, _UTF32Data, _CESU8Data, _IMAPData, _CompoundTextData;

U_CDECL_END

Code point 代码点    Byte 1         Byte 2         Byte 3         Byte 4
U+ 0000 .. 007F        0xxxxxxx
U+ 0080 .. 07FF        110xxxxx    10xxxxxx
U+ 0800 .. FFFF        1110xxxx    10xxxxxx    10xxxxxx
U+ 10000 .. 10FFFF    11110xxx    10xxxxxx    10xxxxxx    10xxxxxx

可变长度编码
🚵🏻‍♀️ is U+1F6B5 + U+1F3FB + U+200D + U+2640 + U+FE0F
🤦🏼‍♂️ 由 5 个代码点 ( U+1F926 U+1F3FB U+200D U+2642 U+FE0F ) 
组成的事实仅仅是实现细节。它不应该被拆开,它不应该被计为多个字符,文本光标不应该位于其中,它不应该被部分选择

关键代码

std::size_t sequence_length(char8_t lead_byte)
{if (lead_byte < 0x80)return 1;else if ((lead_byte >> 5) == 0x6)return 2;else if ((lead_byte >> 4) == 0xe)return 3;else if ((lead_byte >> 3) == 0x1e)return 4;elsereturn 0;
}UTF_ERROR encode_next_utf8(const char32_t code_point, std::u8string &utf8str)
{if (!is_code_point_valid(code_point))return UTF_ERROR::INVALID_CODE_POINT;if (code_point < 0x80) {  // 1 byteutf8str.append(1u, static_cast<char8_t>(code_point));} else if (code_point < 0x800) {  // 2 bytesadd_capacity_if_needed(utf8str, 2);utf8str.append(1, static_cast<char8_t>((code_point >> 6) | 0xc0));utf8str.append(1, static_cast<char8_t>((code_point & 0x3f) | 0x80));} else if (code_point < 0x10000) {  // 3 bytesadd_capacity_if_needed(utf8str, 3);utf8str.append(1, static_cast<char8_t>((code_point >> 12) | 0xe0));utf8str.append(1, static_cast<char8_t>(((code_point >> 6) & 0x3f) | 0x80));utf8str.append(1, static_cast<char8_t>((code_point & 0x3f) | 0x80));} else {  // 4 bytesadd_capacity_if_needed(utf8str, 4);utf8str.append(1, static_cast<char8_t>((code_point >> 18) | 0xf0));utf8str.append(1, static_cast<char8_t>(((code_point >> 12) & 0x3f) | 0x80));utf8str.append(1, static_cast<char8_t>(((code_point >> 6) & 0x3f) | 0x80));utf8str.append(1, static_cast<char8_t>((code_point & 0x3f) | 0x80));}return UTF_ERROR::OK;
}

C++ 标准库

#include <locale>
#include <codecvt>
#include <fstream>
// convert std::string to wstring
std::wstring to_wide_string(const std::string &input)
{//    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;//    return converter.from_bytes(input);std::locale   sys_loc(std::locale("C.UTF-8"));std::ofstream ofs(" cvt_buf ");ofs << input;ofs.close();std::wifstream wifs(" cvt_buf ");wifs.imbue(sys_loc);std::wstring wstr;wifs >> wstr;wifs.close();return wstr;
}// convert wstring to std::string
std::string to_byte_string(const std::wstring &input)
{// std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;//    std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;//    return converter.to_bytes(input);std::locale    sys_loc(std::locale("C.UTF-8"));std::wofstream wofs(" cvt_buf ");wofs.imbue(sys_loc);wofs << input;wofs.close();std::ifstream ifs(" cvt_buf ");std::string   str;ifs >> str;ifs.close();return str;
}std::u32string to_utf32(std::string str)
{return std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t>{}.from_bytes(str);
}std::string to_utf8(std::u32string str32)
{return std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t>{}.to_bytes(str32);
}

参考

The Absolute Minimum Every Software Developer Must Know About Unicode in 2023 (Still No Excuses!) @ tonsky.me

GitHub - soasis/text: A spicy text library for C++ that has the explicit goal of enabling the entire ecosystem to share in proper forward progress towards a bright Unicode future.

utfcpp-3.2.1.tar.gz · src-openEuler/utf8cpp - Gitee.com

GitHub - nemtrif/utfcpp: UTF-8 with C++ in a Portable Way

GitHub - nemtrif/utfcpp20: Unicode encodings with C++20


创作不易,小小的支持一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 10新版Outlook使用不便?教你轻松退回旧版windows mail

引言 自从Windows 10推出新版Outlook以来&#xff0c;很多用户反映新版的邮件应用存在诸多不便&#xff0c;尤其是在广告邮件和正常邮件的分类上做得不够理想。面对这一问题&#xff0c;许多用户希望能够退回到Windows自带的旧版Outlook。在本文中&#xff0c;我们将详细介绍一…

数千万“四高”中老年患者,如何推动国产营养保健品创新

“三高”指高血压、高血糖&#xff08;糖尿病&#xff09;、高血脂&#xff0c;是中老年群体的常见病。 然而&#xff0c;除了前述三者&#xff0c;高尿酸血症在我国的患病率正逐年提高&#xff0c;已成为仅次于糖尿病的第二大代谢性疾病。痛风是高尿酸血症典型症状之一。 加上…

用sed去除配置文件空行和注释 去掉注释 #

sed去除注释行&#xff1a;sed -i -c -e /^#/d config_file sed去除空行&#xff1a; sed -i -c -e /^$/d config_file sed去空行和注释行&#xff1a;sed -i -c -e /^$/d;/^#/d config_file [rootrac1 ~]# cat a a b adss afdsf af # o #asd ## asdf # adfas fad af # a …

【数据结构】07.循环队列

一、循环队列的定义 定义&#xff1a;队列主要有顺序队列&#xff0c;循环队列&#xff0c;双端队列&#xff0c;优先队列。而当中循环队列是一种线性数据结构。它也被称为“环形缓冲器”。它只允许在一端进行插入操作&#xff0c;即队尾&#xff08;rear&#xff09;&#xf…

【对顶堆 优先队列】295. 数据流的中位数

本文涉及知识点 对顶堆 优先队列 LeetCode295. 数据流的中位数 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 …

CVE-2019-12272 Openwrt可视页面LuCi命令注入漏洞复现(完结)

声明 本文所使用的一些源代码等内容已经上传至github&#xff0c;具体地址如下 Vulnerability_POC-EXP/OpenWrt/CVE-2019-12272 at main a2148001284/Vulnerability_POC-EXP GitHub 漏洞简介 参考内容&#xff1a; CVE-2019-12272 OpenWrt图形化管理界面LuCI命令注入分析 |…

有哪些有效的策略可以提升独立站的外链数量?

有哪些有效的策略可以提升独立站的外链数量&#xff1f;提升独立站的外链数量并不难&#xff0c;难得是不被谷歌惩罚把你的网站判定为作弊&#xff0c;正因如此&#xff0c;了解并应用GNB自然外链策略是个不错的开始&#xff0c;GNB外链的核心价值在于它提高了网站外链资源的自…

Hazelcast同一个集群发布注意数据一致性与版本兼容性检查示例

Hazelcast Hazelcast是一个开源的、分布式内存数据网格&#xff08;IMDG&#xff0c;In-Memory Data Grid&#xff09;平台&#xff0c;它提供了一系列的分布式数据管理和计算服务。Hazelcast旨在解决大数据和高性能计算场景下的挑战&#xff0c;特别是在分布式系统中提供低延…

【LinuxC语言】线程池之添加工作任务线程

文章目录 前言工作线程工作流程代码介绍函数内容如何去编写代码概况总结前言 在并发编程中,线程池是一种常见的设计模式,它可以有效地管理和控制线程的执行。线程池中的线程可以执行一系列的任务,这些任务通常是独立且相互没有依赖关系的。在Linux C语言环境下,我们可以使…

如何学习和提升SQL

资料来源于腾讯技术直播&#xff0c;只作为学习记录&#xff0c;如有侵权&#xff0c;请联系作者进行删除

Python正则表达式入门用法(下)

Python的正则表达式模块是re。要使用它&#xff0c;需要先导入re模块。下面是一些常用的正则表达式操作&#xff1a; re.match(pattern, string): 从字符串的开始位置匹配一个模式&#xff0c;并返回匹配对象。如果匹配成功&#xff0c;则返回匹配对象&#xff1b;如果匹配失败…

关于单点登录(Single Sign-On,SSO)

业务背景 在企业发展初期&#xff0c;企业使用的系统很少&#xff0c;通常一个或者两个&#xff0c;每个系统都有自己的登录模块&#xff0c;用户用不同的账号即可登录&#xff0c;很方便。 但随着企业的发展&#xff0c;用到的系统随之增多&#xff0c;用户在操作不同的系统时…

分享6个自己每天都会打开的网站

分享6个自己每天都会打开的网站&#xff0c;有实用办公网站&#xff0c;也有休闲摸鱼网站&#xff0c;链接直达&#xff0c;速看~ 1、鸠摩搜索 https://www2.jiumodiary.com/ 一个免费的电子书下载网站&#xff0c;页面干净无广告&#xff0c;只有一个搜索框&#xff0c;输入…

应用了网络变压器的PC网卡连接转换器后不好连网,有掉线现象,但外接路由器无问题,可能是什么原因?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是应用了网络变压器的PC网卡连接转换器后不好连网&#xff0c;有掉线现象&#xff0c;但外接路由器无问题&#xff0c;可能是什么原因呢&#xff1f;如何解决呢&#xff1f; 首先&#xff0c;我们要了解传…

web前端之浏览器从输入URL到页面展示的过程、建立TCP连接与三次握手、发送HTTP请求、DNS解析、地址、渲染

MENU 前言DNS解析建立TCP连接发送HTTP请求服务器处理请求接收HTTP响应解析HTML解析CSS渲染页面结束 前言 浏览器从输入URL到页面展示的过程&#xff0c;这是一件看似简单却又十分复杂的事情。我们每天都在使用浏览器&#xff0c;却很少关注它们背后的工作原理。本文将从多个方面…

Kotlin/Android中执行网络请求

方式一&#xff1a;使用okhttp3 okhttp官网 okhttp3 github地址 打开build.gradle.kts文件加入依赖 dependencies {implementation("com.squareup.okhttp3:okhttp:4.9.0") }在IDEA的Gradle面板点击reload按钮便会自动下载jar 使用网络请求时需要把网络的权限打开&a…

java必知必会-jsp

文章目录 一、什么是JSP?二、jsp运行原理三、文档结构四、jsp基本语法五、jsp9大内置对象&#xff08;笔试&#xff09;六、el(${el表达式}):Expression Language七、11个内置对象(自定义的数据必须放在域中el才能得到)八、jstl&#xff08;jsp Standard Tag Library)总结 一、…

12.【C语言】创建函数

1.先创建函数&#xff08;一劳永逸&#xff09; Add函数VS2022中不是自带的&#xff0c;需要创建 int Add(int x, int y) {int z 0;z x y;return z; } 2.函数的调用&#xff1a;函数名&#xff08;x&#xff0c;y&#xff09; int sum Add(num1, num2); 完整代码 #de…

Nuxt3 的生命周期和钩子函数(十一)

title: Nuxt3 的生命周期和钩子函数&#xff08;十一&#xff09; date: 2024/7/5 updated: 2024/7/5 author: cmdragon excerpt: 摘要&#xff1a;本文详细介绍了Nuxt3中几个关键的生命周期钩子和它们的使用方法&#xff0c;包括webpack:done用于Webpack编译完成后执行操作…

pytorch-时间序列

目录 1. 时间序列2. word embedding2.1 one hot2.2 word2vec2.3 GloVe 1. 时间序列 具有时间相关性的序列叫做时间序列&#xff0c;比如&#xff1a;语音、文本句子 2. word embedding 2.1 one hot 针对句子来说&#xff0c;可以用[seq_len, vector_len] 有多少个单词vecto…