网站色彩设计网页传奇手游官网
2026/4/17 20:47:20 网站建设 项目流程
网站色彩设计,网页传奇手游官网,电子商务网站开发期末考试,wordpress iis7提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录一、先打破核心认知#xff1a;文本文件#xff08;.cpp#xff09;的本质二、编译器解析字符的核心流程#xff08;反向的“字符→字节”#xff09;关键概念补…提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录一、先打破核心认知文本文件.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 886个字节但编译器按 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里“哈”的码点是U54C8是编译器/程序内部统一识别字符的“中间格式”解码字节 → 码点编译器解析阶段做的事按source-charset编码码点 → 字节编译器生产阶段做的事按execution-charset。三、手把手拆解“哈哈”的UTF-8字节被GBK解析出错的全过程我们先明确基础数据内容哈单个的Unicode码点哈的UTF-8字节16进制哈的GBK字节16进制具体值U54C8E5 93 88B9 FE所以“哈哈”的UTF-8字节是E5 93 88 E5 93 886个字节16进制“哈哈”的GBK字节是B9 FE B9 FE4个字节16进制。步骤1编译器读.cpp文件的原始字节编译器打开你的UTF-8编码.cpp文件先读到一串原始字节16进制E5 93 88 E5 93 88这是硬盘上实实在在存的内容。步骤2编译器按GBK规则“解码”这些字节错误的核心GBK编码的解码规则是GBK是双字节编码一个字符对应2个字节第一个字节范围0x810xFE高字节第二个字节范围0x400xFE低字节解码时按“2个字节一组”拆分查GBK码表把字节组转成对应的码点。现在编译器按GBK规则拆“哈哈”的UTF-8字节E5 93 88 E5 93 88第一组E5 93→ 查GBK码表对应码点U94A3字符“铪”第二组88 E5→ 88不在GBK高字节范围0x81~0xFE解码失败第三组93 88→ 剩下的字节同样解码异常。这就是为什么会报「常量中有换行符」「语法错误」——编译器按GBK拆字节后要么解出乱码字符要么字节组合不符合GBK规则直接判定代码语法错误。步骤3对比正确的UTF-8解码过程如果设置source-charset:utf-8编译器按UTF-8规则解码UTF-8解码规则是UTF-8是变长编码1-4个字节对应一个字符以E5开头二进制11100101说明这是3字节UTF-8字符需取连续3个字节解码拆解E5 93 88 E5 93 88第一组E5 93 88→ 按UTF-8规则解码得到码点U54C8“哈”第二组E5 93 88→ 同样解码得到U54C8“哈”最终正确解析出“哈哈”两个字符无语法错误。四、解答编译器怎么把“字符相关的内容”转换存储整个过程分两步解析生产核心是“字节↔码点”的转换1. 解析阶段source-charset字节 → 码点编译器“读懂”代码输入硬盘上.cpp文件的原始字节流操作按source-charset如GBK/UTF-8的解码规则把字节流拆分成若干组每组转成对应的Unicode码点输出编译器内部的“抽象语法树”AST里面存的是字符的码点比如U54C8不是字节也不是视觉字符。2. 生产阶段execution-charset码点 → 字节编译器“存到.exe”输入编译器内部的码点如U54C8 U54C8操作按execution-charset如UTF-8的编码规则把每个码点转成对应的字节输出把这些字节写入.exe文件的“常量数据区”硬盘上——这就是“把字符串存到程序里”的本质。3. 运行阶段字节 → 变量程序运行时操作系统从.exe的常量数据区读取这些字节复制到内存中为变量开辟的空间里比如string s的内存变量里存的依然是字节不是“字符”你用cout输出时控制台再把这些字节按自己的编码规则解码成视觉字符。总结文本文件.cpp本质是字节流“字符”是字节按编码规则解码后的视觉结果不是文件直接存储的内容编译器解析不是“找字符→转码点”而是“读字节→按编码解码成码点”反向GBK解析UTF-8字节出错的核心GBK是双字节编码按2字节一组拆UTF-8的3字节字符字节组合不符合GBK规则要么解出乱码要么直接报错编码规则的核心作用是“字节↔码点”的转换对照表不同编码的转换规则不同这是乱码的根源。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询