news 2026/4/23 17:11:34

【字符编码】编译器解析字符的底层逻辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【字符编码】编译器解析字符的底层逻辑

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

      • 一、先打破核心认知:文本文件(.cpp)的本质
      • 二、编译器解析字符的核心流程(反向的“字符→字节”)
        • 关键概念补充:
      • 三、手把手拆解:“哈哈”的UTF-8字节被GBK解析出错的全过程
        • 步骤1:编译器读.cpp文件的原始字节
        • 步骤2:编译器按GBK规则“解码”这些字节(错误的核心)
        • 步骤3:对比正确的UTF-8解码过程
      • 四、解答:编译器怎么把“字符相关的内容”转换存储?
        • 1. 解析阶段(source-charset):字节 → 码点(编译器“读懂”代码)
        • 2. 生产阶段(execution-charset):码点 → 字节(编译器“存到.exe”)
        • 3. 运行阶段:字节 → 变量
      • 总结

编译器按GBK(编码页 936) 解析文件字节。
“哈哈” 的 UTF-8 字节是 E5 93 88 E5 93 88(6个字节),但编译器按 GBK 规则拆
这句话描述编译器过程我没太明白,编译器是怎样把一个字符转换为码点进而得到字节的,应该不是所谓的编译器有个字符集然后在字符集里面找到哈哈的码点然后再转为字节的吧,那可是一个cpp文件暂时还是一个文本文件总不会是直接能读到字节的吧,编译器是怎么把字符转换得到字节存储的

你核心想搞懂的是:编译器解析字符的底层逻辑——不是先找“哈哈”这个视觉字符再转码点/字节,而是CPP文本文件本质是字节流,编译器先读字节,再按指定编码(如GBK/UTF-8)解码成码点(字符的唯一标识);你误以为“文本文件存的是字符”,其实是存的字节,“字符”只是人/编辑器的视觉解读,这是理解整个过程的关键。

一、先打破核心认知:文本文件(.cpp)的本质

不管是.cpp、.txt还是其他文本文件,硬盘上存储的永远是一串01二进制(字节),根本没有“哈哈”“a”这类视觉字符

  • 你在VS里看到的“哈哈”,是编辑器(VS)先读文件的字节,再按默认编码(比如UTF-8/GBK)解码成你能看懂的视觉字符;
  • 编译器读.cpp文件时,和编辑器一样,也是先读这些原始字节,再按source-charset指定的编码规则解码——这是整个过程的起点,没有“直接读字符”这一步。

二、编译器解析字符的核心流程(反向的“字符→字节”)

你误以为编译器是“找字符→转码点→转字节”,但实际是反向操作
编译器的解析过程 = 「读原始字节」→「按编码规则解码成码点」→「后续处理(如生产阶段转字节)」

用通俗的比喻:

  • 文本文件 = 一串“密码数字”(字节);
  • 编码规则(GBK/UTF-8)= 密码本(规定“哪几个数字对应哪个字符”);
  • 编译器 = 解码员(拿着密码本,把数字翻译成字符)。
关键概念补充:
  • 码点(Code Point):每个字符的唯一数字标识(比如Unicode里“哈”的码点是U+54C8),是编译器/程序内部统一识别字符的“中间格式”;
  • 解码:字节 → 码点(编译器解析阶段做的事,按source-charset);
  • 编码:码点 → 字节(编译器生产阶段做的事,按execution-charset)。

三、手把手拆解:“哈哈”的UTF-8字节被GBK解析出错的全过程

我们先明确基础数据:

内容哈(单个)的Unicode码点哈的UTF-8字节(16进制)哈的GBK字节(16进制)
具体值U+54C8E5 93 88B9 FE

所以“哈哈”的UTF-8字节是:E5 93 88 E5 93 88(6个字节,16进制);
“哈哈”的GBK字节是:B9 FE B9 FE(4个字节,16进制)。

步骤1:编译器读.cpp文件的原始字节

编译器打开你的UTF-8编码.cpp文件,先读到一串原始字节(16进制):E5 93 88 E5 93 88(这是硬盘上实实在在存的内容)。

步骤2:编译器按GBK规则“解码”这些字节(错误的核心)

GBK编码的解码规则是:

  1. GBK是双字节编码(一个字符对应2个字节);
  2. 第一个字节范围:0x810xFE(高字节),第二个字节范围:0x400xFE(低字节);
  3. 解码时按“2个字节一组”拆分,查GBK码表,把字节组转成对应的码点。

现在编译器按GBK规则拆“哈哈”的UTF-8字节(E5 93 88 E5 93 88):

  • 第一组:E5 93→ 查GBK码表,对应码点U+94A3(字符“铪”);
  • 第二组:88 E5→ 88不在GBK高字节范围(0x81~0xFE),解码失败;
  • 第三组:93 88→ 剩下的字节,同样解码异常。

这就是为什么会报「常量中有换行符」「语法错误」——编译器按GBK拆字节后,要么解出乱码字符,要么字节组合不符合GBK规则,直接判定代码语法错误。

步骤3:对比正确的UTF-8解码过程

如果设置source-charset:utf-8,编译器按UTF-8规则解码:
UTF-8解码规则是:

  1. UTF-8是变长编码(1-4个字节对应一个字符);
  2. E5开头(二进制11100101),说明这是3字节UTF-8字符,需取连续3个字节解码;

拆解E5 93 88 E5 93 88

  • 第一组:E5 93 88→ 按UTF-8规则解码,得到码点U+54C8(“哈”);
  • 第二组:E5 93 88→ 同样解码得到U+54C8(“哈”);
  • 最终正确解析出“哈哈”两个字符,无语法错误。

四、解答:编译器怎么把“字符相关的内容”转换存储?

整个过程分两步(解析+生产),核心是“字节↔码点”的转换:

1. 解析阶段(source-charset):字节 → 码点(编译器“读懂”代码)
  • 输入:硬盘上.cpp文件的原始字节流;
  • 操作:按source-charset(如GBK/UTF-8)的解码规则,把字节流拆分成若干组,每组转成对应的Unicode码点;
  • 输出:编译器内部的“抽象语法树”(AST),里面存的是字符的码点(比如U+54C8),不是字节,也不是视觉字符。
2. 生产阶段(execution-charset):码点 → 字节(编译器“存到.exe”)
  • 输入:编译器内部的码点(如U+54C8 U+54C8);
  • 操作:按execution-charset(如UTF-8)的编码规则,把每个码点转成对应的字节;
  • 输出:把这些字节写入.exe文件的“常量数据区”(硬盘上)——这就是“把字符串存到程序里”的本质。
3. 运行阶段:字节 → 变量
  • 程序运行时,操作系统从.exe的常量数据区读取这些字节,复制到内存中为变量开辟的空间里(比如string s的内存),变量里存的依然是字节,不是“字符”;
  • 你用cout输出时,控制台再把这些字节按自己的编码规则解码成视觉字符。

总结

  1. 文本文件(.cpp)本质是字节流,“字符”是字节按编码规则解码后的视觉结果,不是文件直接存储的内容;
  2. 编译器解析不是“找字符→转码点”,而是“读字节→按编码解码成码点”(反向);
  3. GBK解析UTF-8字节出错的核心:GBK是双字节编码,按2字节一组拆UTF-8的3字节字符,字节组合不符合GBK规则,要么解出乱码,要么直接报错;
  4. 编码规则的核心作用:是“字节↔码点”的转换对照表,不同编码的转换规则不同,这是乱码的根源。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 15:04:28

学术论文实体提取怎么做?Qwen3-0.6B给出答案

学术论文实体提取怎么做?Qwen3-0.6B给出答案 1. 引言:学术论文实体提取的挑战与技术演进 在科研信息化和知识图谱构建日益重要的今天,从海量学术文献中自动提取结构化信息已成为自然语言处理的关键任务。传统的信息抽取方法依赖于规则模板或…

作者头像 李华
网站建设 2026/4/23 11:21:59

腾讯混元翻译模型应用:HY-MT1.5-1.8B在医疗翻译中的实践

腾讯混元翻译模型应用:HY-MT1.5-1.8B在医疗翻译中的实践 1. 引言 随着全球医疗合作的不断深化,跨语言医学文献、病历记录和临床指南的高效准确翻译成为推动国际医疗协作的关键环节。传统机器翻译系统在通用领域表现良好,但在专业性强、术语…

作者头像 李华
网站建设 2026/4/23 16:17:41

NewBie-image-Exp0.1效果展示:3.5B模型生成的动漫作品

NewBie-image-Exp0.1效果展示:3.5B模型生成的动漫作品 1. 技术背景与核心价值 近年来,大规模扩散模型在图像生成领域取得了显著进展,尤其是在动漫风格图像生成方向,高质量、可控性强的模型需求日益增长。然而,许多开…

作者头像 李华
网站建设 2026/4/23 11:23:16

2026 AI语音落地实战:开源ASR模型+弹性GPU部署趋势详解

2026 AI语音落地实战:开源ASR模型弹性GPU部署趋势详解 1. 引言:中文语音识别的工程化落地挑战 随着大模型与智能硬件的深度融合,语音交互正成为人机沟通的核心入口。在客服、会议记录、教育转写等场景中,高精度、低延迟的自动语…

作者头像 李华
网站建设 2026/4/23 13:04:34

Z-Image-Turbo必备工具推荐:支持自定义output命名的部署脚本

Z-Image-Turbo必备工具推荐:支持自定义output命名的部署脚本 1. 引言 1.1 业务场景描述 在当前AIGC快速发展的背景下,文生图模型已成为创意设计、内容生成和智能应用开发的重要工具。阿里达摩院推出的 Z-Image-Turbo 模型凭借其基于 DiT 架构的高效推…

作者头像 李华
网站建设 2026/4/23 12:48:25

Hunyuan-OCR-WEBUI电商应用:商品包装文字识别与合规检测

Hunyuan-OCR-WEBUI电商应用:商品包装文字识别与合规检测 1. 引言 1.1 业务场景描述 在电商平台中,海量商品上架前需完成包装信息的数字化录入与内容合规性审查。传统人工录入方式效率低、成本高,且易出错;而通用OCR工具在面对复…

作者头像 李华