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

08.VSCODE:内嵌MSYS2及三方库UTF8-CPP的实战

在VSCode中集成 MSys2 终端,能让我们的开发过程更顺畅。作为示例,本课以utf8-cpp 为例,演示了在VSCode中一体化安装、使用第三方库的丝滑过程。
注:utf8-cpp是一个历史悠久的 C++ 字符串编码转换库,主要用于unicode字符集下多种编码的互相转换。

vscode中集成 msys2终端及使用示例
本课堂最佳学习次序建议:按本文安排,先阅读部分文字内容,再看文中视频,然后配合文末资料动手操作

0. 为什么要在 vscode 里集成 msys2 终端?

在vscode 中集成 msys2 终端,并非开发的必要步骤。

想要安装第三方库,完全可以在 msys2 自己提供的那个终端程序中,或者前面课程中我们集成在 Windows 终端下集成的 msys2 环境里安装。

不过,想像一下,你在 vscode 里写着代码,发现需要安装一个第三方库——并且这个库正好在 msys2 的仓库中,于是你按下热键 Ctrl + Shift + ` ,打开 vscode 的终端,再打开集成的 msys2,通过 pacman -S 库名,安装好所需库。切回源代码,开始在项目中使用中这个库……

是不是感觉这个过程很丝滑?

1. utf8-cpp 是什么?

网址:github.com/nemtrif/utfcpp 。

因为是 github,所以可能一时打不开,可换个时间段多尝试几次。

我们很快会推出专讲 utf8-cpp 库的独立课程。这里仅作简单介绍。

C/C++ 编程,所使用的字符串主力编码是 utf8(包括源代码文件自身的编码),但是,不少其他编程语言它们的主力编码是 UCS32 或 UCS16。因此,当 C++ 写的程序需要和别的语言写的程序交换数据(可能通过网络通信,也可能是读取对方生成的数据文件等手段),收到的数据可能是 UCS32 或 UCS16 等其他编码,此时 C++ 程序为了方便处理这些数据,第一步要做的,就是将它们转换成 utf8 编码。

反过来,如果需要将数据发送给别的程序,C++程序有可能需要将 utf8 编码的字符串,转换成 UCS32 或 UCS16等其他编码。

以上转换过程,可以使用 utf80cpp 这个库。这是一个纯头文件的库,因此使用起来很方便,并且支持多个平台(Windows、Linux 等)。

2. 课堂视频

(很短,6分钟,具体设置内容,代码等,学习时以总体上理解为主;无需在观看视频时细究内容,具体内容都已为您细心地附在本文后续文本内容中)

VSCODE.07-内嵌MSYS2及三方库utf8cpp实战

3. 关键配置内容

一、在 vscode 中切换到需集成 msys2 的开发专用配置。本课程之前准备的 CS-Cpp-Simple 或 CM-Cpp-CMake 建议都集成。其中,CMake 的项目使用第三方库的可能性更高。

二、Ctrl+, 进入设置,确保选中 “用户” 级别设置。在设置过滤栏中,输入以下关键词:Terminal Integrated Profiles Windows,再点击该设置项的内的 在 settings.json中编辑 链接,将打开该设置文件以直接编辑。

三、在 “terminal.integrated.profiles.windows” 项内最后,添加以下内容:

,
"MSYS2-UCRT64": {
            "path": "C:\\msys64\\msys2_shell.cmd", 
            "args":[
                "-defterm", "-here", "-no-start", "-ucrt64"
            ],            
            "icon": "terminal-bash",
            "overrideName": true            
        }

注意:

  1. 其中的 “path” 字段的路径,替换成你的msys2实际安装的路径,且注意添加转义符;
  2. icon 只能是vscode 内置图标的名称 (输入时,vscode 会自动给出列表);
  3. “overrideName” 项在视频中没有讲,作用是确保使用 “MSYS2-UCRT64” 作为终端名字,包括打开该终端后显示的内容(否则会显示终端的实际进程名字 “bash”);
  4. “-ucrt64” 和你当初安装 msys2 的选择有关,详见本课程第一课。

4. utf8-cpp 安装

以 64 位,ucrt 环境为例,utf8cpp 的包名字为 mingw-w64-ucrt-x86_64-utf8cpp。可以在集成的 msys2 终端内,通过执行以下指令搜索及安装该开发库。

(一)搜索(可选步骤)
pacman -Ss mingw-w64-ucrt-x86_64-utf8cpp

(二)安装
pacman -S mingw-w64-ucrt-x86_64-utf8cpp

5. utf8-cpp 使用示例

  • 完整代码
#include <iostream>
#include <string>

#include <utf8cpp/utf8.h>

int main()
{
    std::wstring wstr = L"我是 UNICODE 字符集下的宽字符";  // Windows 下宽字符串

    // 目标: 将 wstring -> string (utf-8 编码)

    // 第1步:先转为固定的 32 位编码:
    std::u32string u32str { wstr.cbegin(), wstr.cend() };

    // 第2步:再转为 utf-8 编码:
    std::string utf8str = utf8::utf32to8(u32str); 

    // 输出结果:
    std::cout << utf8str << std::endl;
}
  • 难点、关键点解释
  1. std::u32string 是 C++11 引入的字符串类型,用于存储、表达每个字符固定为 32 位(四字节)的字符串;
  2. std::wstring 宽字符串,可用 L"字符串内容" 的字面值初始化。该类型的最大问题是平台相关(Windows 下2字节,Linux 等平台下 4 字节);
  3. std::wstring 可直接转换成 std::u32string,如代码中“第1步”所示;
  4. utf8::utf32to8()函数可将 std::u32string 转换成 std::string(以 utf-8编码),如代码中“第2步”所示。

http://www.kler.cn/a/461082.html

相关文章:

  • Go 语言 API 限流实战:保障系统稳定性的护盾
  • kubelet状态错误报错
  • MySQL面试题(updating)
  • 原生js封装ajax请求以及css实现提示效果和禁止点击效果
  • 2024年中国新能源汽车用车发展怎么样 PaperGPT(一)
  • Ceph 手动部署(CentOS9)
  • Spring 框架——@Async 注解
  • 可以突破合同相对性原则,不包括借用资质及多层转包和违法分包关系中的实际施工人
  • 【华为OD-E卷-统计匹配的二元组个数 100分(python、java、c++、js、c)】
  • 大语言模型遇上寻路算法:LLM-A*如何让路径规划效率提升50%?
  • 高效管理 Nginx 的利器:nginxWebUI 指南和 Docker 部署安装过程
  • 又一年。。。。。。
  • QT_BEGIN_NAMESPACE 和 QT_END_NAMESPACE (二)
  • 基于Spring Boot + Vue3实现的在线汽车保养维修预约管理系统源码+文档
  • MySQL 并行复制:提升数据同步速度的秘密武器
  • Maven (day04)
  • Type-C接口台式显示器:LDR6021引领新潮流
  • 激光雷达点云语义分割——Polarseg环境配置
  • 深入理解 MVCC:多版本并发控制详解
  • Android 系统 AlarmManager 系统层深度定制
  • Qt信号的返回值
  • Xpath学习
  • AirLLM: 分层推理在低内存硬件上的应用
  • k8s 部署meilisearch UI
  • CentOS 7系统 OpenSSH和OpenSSL版本升级指南
  • 基于编程语言的知识图谱表示增强大模型推理能力研究,一种提升LLM推理准确率达91.5%的结构化数据方法