news 2026/4/23 12:45:52

【字符编码】字符串处理流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【字符编码】字符串处理流程

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

文章目录

      • 一、先搞懂两个核心编码概念(通俗版)
      • 二、完整流程拆解:从.cpp文件到输出“哈哈”(VS编译+运行)
        • 阶段1:翻译阶段(源代码解析,对应source-charset)
        • 阶段2:生产阶段(生成运行代码,对应execution-charset)
        • 阶段3:运行阶段(程序执行,变量赋值)
        • 阶段4:输出阶段(cout打印)
      • 三、解答你最关心的几个具体问题
        • 1. “把字符串常量打包成UTF-8格式放到最终程序里”是什么意思?
        • 2. `string s="哈哈"` 字符串存入变量是什么阶段?放入变量就是放在程序里吗?
        • 3. 翻译阶段和生产阶段的核心区别?
      • 总结

这里有几个问题我不清楚

源代码解析编码、运行时字符串编码是什么意思,这个我搞不清楚
只管 “生产阶段”:仅告诉编译器 “把代码里的字符串常量,打包成 UTF-8 格式放到最终程序里”。 这个放在程序中是什么意思
string s=“哈哈” 字符串常量存放进入变量里面是什么阶段,放入变量就是放在程序里面的意思吗
你说的生产阶段和翻译阶段我还是不等,一个某种编码cpp文件边vs编译读取到变量并输出这个过程你详细说一下

你想弄明白“源代码解析编码”“运行时字符串编码”的具体含义,还想清楚从UTF-8编码的.cpp文件被VS编译,到string s="哈哈"里的字符串存入变量、最终输出的完整过程,尤其是“翻译阶段”“生产阶段”对应的实际操作,以及“把字符串打包到程序里”到底是什么意思——我用“写纸条→翻译→打包→运行”的通俗比喻,一步步拆解整个流程,你就能彻底理解了。

一、先搞懂两个核心编码概念(通俗版)

把编译器和程序比作“翻译员+仓库管理员”,编码就是“沟通规则”:

编码类型通俗解释类比场景
源代码解析编码(source-charset)编译器“读懂”你写的.cpp文件的规则(相当于翻译员读你写的纸条的规则)你用“UTF-8字体”写了“哈哈”在纸条上,翻译员默认只会认“GBK字体”,得告诉他按UTF-8认
运行时字符串编码(execution-charset)编译器把“纸条上的关键内容”抄到“运行时手册”(.exe程序)里的书写规则翻译员把“哈哈”抄到手册里时,用UTF-8写还是GBK写,程序运行时就按这个规则读

二、完整流程拆解:从.cpp文件到输出“哈哈”(VS编译+运行)

我们以最常见的场景为例:

  • 你的.cpp文件是无BOM的UTF-8编码(新手最常遇到的格式);
  • 代码核心是:string s="哈哈"; cout << s;
  • 全程用VS2019/2022编译运行。

整个过程分4个阶段,每个阶段讲清楚“做什么、编码怎么作用、‘哈哈’发生了什么变化”:

阶段1:翻译阶段(源代码解析,对应source-charset)

核心动作:编译器(cl.exe)打开你的.cpp文件,逐字节“读”文件内容,把字符转换成自己能处理的内部格式(比如Unicode)。
编码的关键作用:解决“编译器能不能认对‘哈哈’”的问题。

  • 无设置(默认情况):
    编译器按GBK(编码页936)解析文件字节。“哈哈”的UTF-8字节是E5 93 88 E5 93 88(6个字节),但编译器按GBK规则拆,会把这6个字节当成3个GBK字符(比如乱码“铪铪”),甚至因为字节组合不合法,直接报「常量中有换行符」「语法错误」——这就是“解析失败”,编译都过不了。
  • 设了/source-charset:utf-8
    编译器按UTF-8规则解析这6个字节,正确识别出是“哈哈”两个字,转换成内部的Unicode格式(U+54C8 U+54C8)——这一步编译器才算“读懂”了你的代码。
阶段2:生产阶段(生成运行代码,对应execution-charset)

核心动作:编译器把“读懂”的代码转换成计算机能执行的机器指令,同时处理字符串常量。
编码的关键作用:解决“把‘哈哈’以什么格式存到.exe里”的问题。

  • 关键操作:
    编译器会把内部的“哈哈”(Unicode)再转换成execution-charset指定的编码(比如UTF-8),然后把这些字节(E5 93 88 E5 93 88打包到最终生成的.exe文件里——这就是“把字符串常量放到程序里”的具体含义!
  • 重要说明:
    .exe文件不只是“执行指令”,还有一块专门的“常量数据区”(硬盘上),“哈哈”的UTF-8字节就存在这里;此时还没有“变量s”,变量是运行时才有的。
阶段3:运行阶段(程序执行,变量赋值)

核心动作:你双击.exe文件,操作系统把.exe加载到内存,CPU执行机器指令。
“哈哈”存入变量的过程

  1. 程序运行到string s="哈哈"这一行时,先从.exe的“常量数据区”(硬盘加载到内存)读取“哈哈”的UTF-8字节(E5 93 88 E5 93 88);
  2. 操作系统在内存里开辟一块空间,创建string类型的变量s
  3. 把读取到的“哈哈”字节复制到s的内存空间里——这就是“字符串常量存入变量”,这个过程发生在运行阶段(不是编译阶段)。
阶段4:输出阶段(cout打印)

核心动作:程序执行cout << s,把变量s里的字节输出到Windows控制台。
编码的坑
Windows控制台默认用GBK(编码页936)显示内容,如果直接输出UTF-8字节,控制台会把E5 93 88 E5 93 88按GBK解析,显示成乱码(比如“鍝堝搱”)。

  • 解决办法:加SetConsoleOutputCP(65001),告诉控制台“按UTF-8规则解析显示字节”,这样就能正确输出“哈哈”。

三、解答你最关心的几个具体问题

1. “把字符串常量打包成UTF-8格式放到最终程序里”是什么意思?
  • 最终生成的.exe文件(在硬盘上)有两个核心部分:
    ① 机器指令(告诉CPU该做什么,比如“创建变量s”“输出s”);
    ② 常量数据区(存放固定不变的内容,比如"哈哈"的字节、数字100等)。
  • “打包到程序里”就是:编译器把"哈哈"转换成UTF-8字节,写入.exe的“常量数据区”——程序没运行时,这些字节就躺在硬盘的.exe文件里,运行时才被加载到内存。
2.string s="哈哈"字符串存入变量是什么阶段?放入变量就是放在程序里吗?
  • 存入变量:运行阶段(只有双击.exe,程序跑起来后才会执行这一步);
  • 不是一回事:
    • “放在程序里”:编译阶段,字节存在硬盘的.exe文件里(静态的,不运行也在);
    • “放入变量”:运行阶段,字节从.exe加载到内存的变量中(动态的,程序关了就没了)。
3. 翻译阶段和生产阶段的核心区别?
  • 翻译阶段:编译器“读文件、懂代码”(处理的是硬盘上的.cpp文件,核心是“解析”);
  • 生产阶段:编译器“写.exe、存常量”(处理的是要生成的.exe文件,核心是“生成”)。

总结

  1. 源代码解析编码(source-charset):管编译器“能不能读对”代码里的字符,解决编译报错问题;
  2. 运行时字符串编码(execution-charset):管编译器“把字符存成什么格式”到.exe里,解决运行时乱码问题;
  3. string s="哈哈":“哈哈”先在编译阶段以指定编码存到.exe里,运行阶段才加载到内存的变量s中,输出时还要匹配控制台编码才不会乱码。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 18:44:31

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

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

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

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

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

作者头像 李华
网站建设 2026/4/3 1:10:42

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

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

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

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

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

作者头像 李华
网站建设 2026/4/21 2:35:20

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

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

作者头像 李华
网站建设 2026/4/18 9:50:43

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

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

作者头像 李华