有关字符编码和字符集的概念,一直是云里雾里的,虽然知道一些 Ascii 、Unicode 、UTF-8 、GBK 、单字节、多字节、宽字符、char 、wchar_t 、string 、wstring 等知识,但是并不能完全将他们串起来,特别是涉及到他们之间进行转换的时候,一旦在项目中,碰到乱码的问题,就觉得无从下手。
请各位有经验的老哥推荐一些这方面的书籍。如果书中有 C/C++示例就更棒了。

《编码》?

以前收藏过一篇文章 www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC%8C%E4%BD%A0%E6%89%80%E9%9C%80%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84.html

utf8everywhere.org/zh-cn

你在国内做东西的话知道 UTF-8 ,GBK 什么的就够了,不用知道太多,字符编码这个东西本质上就是用一套编码体系来映射文字和符号。看 OP 的描述应该是做 C/CPP 开发的,我是做嵌入式开发的,建议你还是能不用中文输出就不用,对嵌入式设备来说输出中文有点浪费资源,print 也就是提示使用者程序的运行进度而已,也不必要必须是中文。如果你必须这么做的话,有几个建议:1.你可以用支持 Unicode 字符集的编译器(GCC/Clang)之类,但是需要在编译过程中加选项才可以。2.可以在对应文件首部添加 // -- coding: utf-8 -- 来声明文件使用 UTF-8 编码。3.也有在运行前在终端上执行 chcp 65001 这个命令的,我自己有试过但是好像不太尽人意。4.可以引入宽字符集<wchar.h>,这条在网上搜到的,我没用过,OP 可以自己查查。

自荐一篇, zhuanlan.zhihu.com/p/73917931?utm_campaign=&utm_medium=social&utm_oi=64779674714112&utm_psn=1690416459556118528&utm_source=zhihu

老哥 插个楼问一问 嵌入式最近是不是需求量很大?什么原因啊,我看 8 月份招聘量挺高的 www.jobui.com/trends/quanguo-qianrushi/

这个我还真不太清楚,我觉得应该是和国家宏观战略有关,做芯片搭边的产业可能会有额外补贴。

我现在在做大数据开发,主要是学校不好我现在实习都不敢找嵌入式这种起点高的。

#2 我的收藏夹里也是这篇文章😂

字符集是一个字符对应哪个整数,编码是怎么存这个整数,这个整数可能会很大,需要多个字节来存。说白了,就这么回事。 liyucang-git.github.io/2019/06/17/%E5%BD%BB%E5%BA%95%E5%BC%84%E6%87%82Unicode%E7%BC%96%E7%A0%81/

字符集:ASCII Unicode GBK(没看过标准文档,不确定 GBK 是不是字符集和编码一起规定了)因为目前绝大多数计算机内部存储、处理的是二进制数值,所以要给不同的字符编上序号,所有编好号的字符组成字符集。字符编码(字符对应的整数在计算机内的二进制编码方案):UTF-8 UTF-16 GBK 7bitASCII计算机处理二进制数据时是有一定限制的,比如有位长度限制(16bit, 32bit 等),有存储器最小访问长度限制(byte bits ,单字节位长度,目前主流计算机是 8bit),所以要根据不同限制,把字符序号转换成计算机能处理的数据。比如 7bit ASCII 是用于 byte bits>=7 的计算机,一个字符使用且最多使用一个字节,属于单字符单字节的编码方案。UTF-8 则是单字符多字节。char:应该是 C/C++语言的概念,是一个主要用于表示字符的整数类型,一般来说长度是 1 字节。宽字符、wide char 、wchar_t:应该也是 C/C++语言的概念,一般是能存储 Unicode 字符的整数类型,一般来说长度是 2 或 4 字节。

感谢~ 猜是政策问题

感谢老哥推荐好书,收藏了。大致看了一下目录,感觉这本应该偏计算机组成原理。

正打算写,从 19 年到现在,我看了上千个网页,几十本包括 Unicode 、ISO/IEC 、中国的 GB 系列在内的 PDF 文档,写了二十多万字的笔记,正在重新整理安排如何由浅入深的介绍。看得越多越发现我可能永远也学不会字符编码了,因为要精通全世界各国语言才能明白它为什么这么设计,以及一些早期的文档已经找不到,但我还是有很大的把握能写出一篇全网讲得较为明白的长文或书。顺便问下,由于有的地方需要一些佐证,有没有好心人能借用 ISO/IEC 会员,我想把历年来所有 ISO/IEC 字符编码标准下载下来。

此两篇应该足够,① 详细讨论分析,②工作快速对照。 从起因分析,到 C++ 在 MSVC / MinGW 下的代码验证。甚是符合题主的提问。①极繁根因分析 --> 愿编程不再乱码(含 Qt)-根因深究 [★★★★★] ifmet.cn/posts/c0862e62②极简图表解释 --> 古文码、口字码、符号码、问号码、棍拷码 [★★★★★] blog.csdn.net/qq_33154343/article/details/99617767且若是额外有兴趣可看 Github QtExamples 的第六章

好多好多年前,有一篇《字节那些事儿》: blog.csdn.net/dandycheung/article/details/5881620

自己手动转换基本上不可能,等于重新造一个 ICU (International Components for Unicode),不如直接调库吧

可能是国产仪器需求带动的。现在大力提倡科学仪器国产化,从几十块的小设备到几百上千万的核磁、质谱,所有都优先采购国产,这需求不就一下子出来了吗

应该就是这个原因

贴一个, www.toutiao.com/article/6694122324980924932/

其实就是两个概念,理解了就没什么了。

我之前写过一篇博客,可以参考一下: fasionchan.com/posts/coding/

维基百科看看就行了,配合 hexdump 一下

unicode explained

直接维基百科看

yelog.org/2017/09/25/ascii-ansi-unicode-utf-8/

如果是 Windows 使用 VS 开发,需要注意,源文件使用的编码是跟随当前操作系统的,比如你用简体中文版本,源文件里面的字符串字面量就是 GB1080 ,如果用了繁体字面量在台湾版本的 Windows 下显示是不正常的,这里的原因就需要继续了解文字编码和语言字体的关系了。

另外 UTF-8 、UTF-16 和 UTF-32 不是 32 > 16 > 8 的关系,UTF-16 是个有缺陷的编码方式,不能表示全部字符集。只有 UTF-8 和 UTF-32 可以。只要记住结论 UTF-8 最牛逼就行了。