首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C++ 开发者必看!STL 库 + 字符编码一篇通,告别乱码与重复造轮子

C++ 开发者必看!STL 库 + 字符编码一篇通,告别乱码与重复造轮子

作者头像
草莓熊Lotso
发布2025-10-29 15:06:16
发布2025-10-29 15:06:16
860
举报
文章被收录于专栏:C++/LinuxC++/Linux

🔥草莓熊Lotso:个人主页

❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》

生活是默默的坚持,毅力是永久的享受。


🎬博主简介:


前言

如果你是正在学习 C++ 的开发者,大概率听过两个 “绕不开” 的话题:一是 STL 库 —— 江湖传言 “不懂 STL,不算会 C++”,它能帮你跳过重复造轮子的坑,直接调用成熟的数据结构与算法;二是字符编码 —— 写代码时突然遇到的 “乱码”,多半是 ASCII、Unicode、GBK、UTF-8 没搞明白。这篇博客就从基础出发,一边带你吃透 STL 库的核心(版本、六大组件、学习路径),一边理清字符集之间的演化关系,帮你打通 C++ 开发的 “基础关卡”,不管是笔试面试还是实际项目,都能少走弯路。


一.STL库:C++开发者的"效率神器"

1.1 什么是STL

  • STL:是C++标准库的重要组成部分,不只是一个可复用的代码组件库,而且还是一个包罗数据结构与算法的软件框架,能够帮我们快速实现一下啊复杂功能,避免像之前C语言一样重复实现一些底层逻辑。

1.2 主流STL版本对比:特点和差异

--不同的编译器适配的STL版本也不同,搞懂差异能让我们使用起来更得心应手。

原始版本:

  • Alexander Stepanov,Meng Lee在惠普实验室完成的原始版本,本着开源的精神,他们声明允许任何人任意运用,拷贝,修改,传播,商业使用这些代码,无需付费。唯一的条件就是也需要像原始版本一样做开源使用。HP版本--所有STL实现版本的始祖。

P.J. 版本

  • 由 P.J. Plauger 开发,它继承自 HP 版本,被 Windows Visual C++ 所采用。不过该版本不可公开或修改,存在可读性较差、符号命名比较怪异的缺陷。

RW 版本

  • 由 Rouge Wage 公司开发,同样继承自 HP 版本,被 C++ Builder 采用。此版本也不允许公开或修改,可读性表现一般。

SGI 版本

  • 由 Silicon Graphics Computer Systems, Inc 公司开发,继承自 HP 版本,被 GCC(Linux 环境下)采用。它具有良好的可移植性,支持公开、修改,甚至能进行贩卖。从命名风格和编程风格来看,可读性极高。后续我们学习 STL 并阅读部分源代码时,主要参考的就是这个版本

版本

开发者 / 机构

适配编译器

特点

HP 版本

Alexander Stepanov、Meng Lee

-

所有 STL 版本的 “始祖”,开源免费,允许修改与商业使用

P.J. 版本

P.J. Plauger

Windows Visual C++

闭源不可修改,可读性低,符号命名怪异

RW 版本

Rouge Wage 公司

C++ Builder

闭源不可修改,可读性一般

SGI 版本

Silicon Graphics

GCC(Linux)

推荐学习版本!可移植性强、开源可修改,命名与编程风格清晰,适合阅读源码

1.3 STL六大组件

--这里不做过多的介绍,在后续的学习中我们会慢慢了解到这些组件的。

1.4 为什么一定要学STL?(3个方面3个理由)

1.4.1 笔试面试刚需
  • 笔试常考用STL实现数据结构(如两个栈实现队列)以及其它算法题高频使用STL库,面试中STL的相关知识也是考的比较多的

笔试题: 把二叉树打印成多行_牛客题霸_牛客网 重建二叉树_牛客题霸_牛客网 用两个栈实现队列_牛客题霸_牛客网 面试题:

1.4.2 工作效率和个人能力
  • 网上有句话说:“不懂STL,不要说你会C++”.STL是C++中的精华,熟练运用STL是区分“新手”与“合格开发者”的重要标志,也是后续学习编程的基础,在工作中也能帮助我们快速提高效率。

1.5 STL学习的三大境界:从"熟用'到“扩充”

根据下面这段话我们可以知道学习STL大概可以分为三个境界:

简单总结一下学习STL的三个境界就是:能用,明理,能扩展。


二.字符编码:从乱码到清晰

2.1 为什么需要字符编码

  • 这个我们在前面C语言的学习中就讲到过,计算机只认识“0”和“1”,字符编码简单来讲就是将人们可读的字符转换为二进制的规则,这其中不同的编码存在一些差异,但是本质上来说都是差不多的。

2.2 四种常用的编码:区别与联系

  • ASCII:最基础的编码,仅包含英文字母、数字、标点符号,用 1 个字节(8 位)表示,能表示 128 个字符。缺点明显 —— 无法存储中文、日文等非英文字符,这也是早期软件出现乱码的原因之一。
  • GBK:为解决中文存储而生的 “国家标准编码”,兼容 ASCII(英文字符用 1 字节),中文用 2 字节表示,能覆盖简体中文、繁体中文等字符。但缺点是 “地域性强”,仅在中文场景适用,跨语言(如中英文混排)时易出问题。
  • Unicode:“统一字符集”,目标是覆盖全球所有语言的字符(包括中文、英文、日文、符号等),每个字符分配唯一的 “编码值”(如‘A’是 U+0041,‘中’是 U+4E2D)。但 Unicode 只是 “字符与编码值的映射表”,不规定 “如何存储”—— 如果直接用 4 字节存储所有字符,会浪费大量空间(英文字符只需 1 字节,却要占 4 字节)。
  • UTF-8:Unicode 的 “存储方案”,是目前最主流的编码(如网页、代码文件多采用 UTF-8)。它的核心是 “可变长存储”:英文字符用 1 字节(兼容 ASCII),中文用 3 字节,生僻字符用更多字节,兼顾 “全球字符覆盖” 与 “存储效率”,完美解决了 ASCII 的局限和 Unicode 的存储浪费问题。

编码类型

核心特点

存储字节

覆盖字符范围

局限性 / 优势

ASCII

最基础编码,仅含英文字母、数字、标点符号

1 字节(8 位)

128 个字符

缺点:无法存储中文、日文等非英文字符,早期软件乱码原因之一;优势:简单基础

GBK

为解决中文存储的 “国家标准编码”,兼容 ASCII

英文字符 1 字节,中文 2 字节

简体中文、繁体中文等

缺点:地域性强,仅在中文场景适用,跨语言易出问题;优势:解决中文存储问题

Unicode

“统一字符集”,为全球所有语言字符分配唯一编码值

若直接存储,所有字符用 4 字节

全球所有语言字符(中文、英文、日文、符号等)

缺点:直接存储会浪费大量空间(英文字符只需 1 字节却占 4 字节);优势:覆盖全球字符

UTF - 8

Unicode 的 “存储方案”,目前最主流编码

可变长存储(英文字符 1 字节,中文 3 字节,生僻字符更多字节)

全球所有语言字符

优势:兼顾 “全球字符覆盖” 与 “存储效率”,完美解决 ASCII 的局限和 Unicode 的存储浪费问题

代码演示:(大家可以自己下去运行调试看看)

代码语言:javascript
复制
int main()
{
	char buff1[] = "abcA";
	buff1[0]++;

	char buff2[] = "草莓熊Lotso";
	cout << sizeof(buff2) << endl;//

	buff2[1]++;
	cout << buff2 << endl;

	buff2[1]++;
	cout << buff2 << endl;

	buff2[3]++;
	cout << buff2 << endl;

	buff2[3]++;
	cout << buff2 << endl;

	return 0;
}

2.3 UTF-8、UTF-16、UTF-32的对比

对比维度

UTF-8

UTF-16

UTF-32

编码方式

可变长(1-4 字节)

可变长(2 字节为主,辅助字符 4 字节)

固定长(始终 4 字节)

空间占用

英文 1 字节(省空间),中文 3 字节

基本字符 2 字节(适中)

所有字符 4 字节(较浪费)

核心优势

兼容 ASCII,网络 / 文件传输主流

基本字符处理效率高

字符定位 / 操作最简单高效

典型应用场景

网页、Linux 系统、邮件、代码文件

Windows 系统、Java/.NET 虚拟机

高要求字符处理库、特定算法场景

补充资料:

  • UTF-8:
  • UTF-16:
  • UTF-32:

2.4 开发中的使用建议:避免乱码

  • 代码文件中推荐统一使用UTF-8编码(IDE中可以设置)
  • 用STL的string容器处理文本时,注意编码的统一性(比如读取GBK文件时,需转换成UTF-8再存储,避免乱码)
  • 跨平台使用时,优先使用UTF-8,避免一些因为编码差异产生的兼容性问题。

结尾

往期回顾:

《从崩溃到精通:C++ 内存管理避坑指南,详解自定义类型 new/delete 调用构造 / 析构的关键逻辑》

别再用函数重载堆代码了!C++ 模板初阶教程:原理 + 实例 + 避坑,新手也能秒懂

结语:STL 是 C++ 的 “效率工具”,字符编码是开发的 “避坑基础”,两者学好能少走很多弯路。刚开始不用追求精通,先会用 STL 做开发、记牢 UTF-8 主流地位,后续再逐步深入。觉得有用欢迎点赞收藏,可以在评论区聊聊你用 STL 踩过的坑或编码解决技巧,一起进步!

✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一.STL库:C++开发者的"效率神器"
    • 1.1 什么是STL
    • 1.2 主流STL版本对比:特点和差异
    • 1.3 STL六大组件
    • 1.4 为什么一定要学STL?(3个方面3个理由)
      • 1.4.1 笔试面试刚需
      • 1.4.2 工作效率和个人能力
    • 1.5 STL学习的三大境界:从"熟用'到“扩充”
  • 二.字符编码:从乱码到清晰
    • 2.1 为什么需要字符编码
    • 2.2 四种常用的编码:区别与联系
    • 2.3 UTF-8、UTF-16、UTF-32的对比
    • 2.4 开发中的使用建议:避免乱码
  • 结尾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档