CE6.3中文版汉化实战:从界面本地化到工程落地的完整指南
简介CE6.3中文版即Cheat Engine 6.3的汉化版本面向游戏修改爱好者、进阶玩家及程序调试人员用于扫描和编辑游戏进程内存实现数值修改、脚本自动化与程序调试。压缩包共78个文件约7MB以dll动态库、exe可执行程序、txt说明文档、ini配置文件为主另含po语言包、pas与lua脚本、sys驱动、chm帮助文档及多平台ceserver组件覆盖运行、配置与源码等不同用途。目前已有447人学习下载。该版本提供内存扫描、内存编辑、表格编辑器、Lua脚本支持、反作弊识别、调试工具与十六进制编辑等功能中文界面降低了非英语用户的上手门槛并兼容Windows XP至Windows 10及多数32位、64位游戏程序。使用者可借助表格系统管理多个内存地址通过脚本实现自动化修改与事件跟踪也可利用调试与十六进制功能理解游戏数据结构适合希望深入掌握内存修改与调试技巧的读者参考实践。1. CE6.3中文版从界面汉化到工程落地的完整路径CE6.3中文版这个词在嵌入式圈子里被搜到的频率远比想象中高。很多人第一次接触它是在接手一个老项目时——代码能编译、板子能跑但开发环境里菜单全是英文文档是英文报错也是英文团队里新来的同事上手就要先过语言关。CE6.3中文版要解决的核心问题不是简单地把界面文字换成中文而是让整个开发链路——从 IDE 菜单、帮助文档、编译输出到目标机运行时——都能用中文语境理解和操作。它适合两类人一是维护 legacy 嵌入式项目的工程师需要在原有工具链上做本地化适配二是教学或培训场景需要让初学者在母语环境下理解编译、烧录、调试的完整流程。这一章先把边界划清楚CE6.3中文版通常指对某嵌入式开发环境 6.3 版本进行中文本地化包括资源文件替换、字体适配、编码转换和运行时区域设置而不是重新开发一套 IDE。2. CE6.3中文版的本地化原理与资源拆解2.1 为什么直接替换字符串会翻车很多人以为汉化就是把 exe 或 dll 里的英文字符串换成中文用资源编辑器改完保存就完事。实际操作中这样做大概率会导致界面错位、菜单截断甚至程序启动失败。原因在于 CE6.3 这类开发环境通常使用 MFC 或 Qt 构建字符串资源有固定的长度限制和编码格式。英文 File 占 4 个字符中文 文件 在 UTF-16 下占 4 个字节但显示宽度是 2 个汉字如果资源表里预留的缓冲区按单字节计算替换后就会溢出。更隐蔽的问题是编码资源文件可能是 ANSI 编码而中文需要 GBK 或 UTF-8直接写入会导致乱码。常见做法是先用资源提取工具把字符串表导出为结构化文本确认编码和长度约束后再批量替换而不是在二进制层面硬改。2.2 资源文件的定位与提取CE6.3 的界面资源通常分布在几个位置主程序 exe 内的字符串表、独立资源 dll、以及 XML 或 ini 格式的配置文件。第一步是定位这些文件。可以用 Resource Hacker 或类似工具打开 exe查看 String Table 和 Dialog 资源。对于 dll重点看是否有 language 子目录或 locale 文件夹。配置文件则直接搜索包含英文菜单项的 xml。# 在 CE6.3 安装目录下查找所有可能包含界面字符串的资源文件 find /opt/ce63 -type f \( -name *.exe -o -name *.dll -o -name *.xml -o -name *.ini \) \ | xargs grep -l File\|Edit\|View\|Project 2/dev/null \ | head -40这段命令的作用是快速缩小范围。find定位可执行文件和配置文件grep -l列出包含典型英文菜单词的文件。参数说明-type f只找普通文件避免目录干扰2/dev/null屏蔽权限报错head -40防止输出过长。执行后你会得到一份候选清单按文件类型分类exe 和 dll 需要资源编辑器处理xml 和 ini 可以直接文本编辑。2.3 编码转换与字体适配提取出英文字符串后下一步是建立映射表并处理编码。CE6.3 中文版最常见的编码方案是 GBK因为很多老版本工具链对 UTF-8 支持不完整。如果原始资源是 ANSI替换后的中文必须保存为 GBK否则界面显示问号。字体方面默认的 MS Sans Serif 或 System 字体不含中文字形需要在对话框资源里把字体改为宋体或微软雅黑并调整字号。字号通常从 8pt 调到 9pt因为汉字在相同磅值下视觉上比英文小。# 将提取的字符串映射表从 UTF-8 转为 GBK 并生成替换脚本 import csv mapping [] with open(strings_utf8.csv, r, encodingutf-8) as f: reader csv.reader(f) for row in reader: if len(row) 2: mapping.append((row[0], row[1])) with open(strings_gbk.csv, w, encodinggbk, errorsreplace) as f: writer csv.writer(f) for eng, chn in mapping: # 检查中文长度是否超过英文长度过多超过 1.5 倍需要标记 ratio len(chn) / max(len(eng), 1) flag CHECK if ratio 1.5 else OK writer.writerow([eng, chn, flag]) print(f共处理 {len(mapping)} 条标记 CHECK 的条目需要人工确认对话框宽度)逻辑说明读取 UTF-8 格式的映射表逐条转换编码并写入 GBK 文件。关键参数是errorsreplace遇到无法转换的字符用问号替代而不是抛异常方便后续排查。ratio计算中文与英文长度比超过 1.5 倍的条目意味着对话框可能需要加宽否则文字会被截断。这一步是血泪经验曾经有一个项目因为没做长度检查汉化后 30% 的对话框按钮文字显示不全返工花了两天。2.4 运行时区域设置与编译输出汉化界面汉化只是第一步编译器的输出信息、帮助文档和运行时库的报错也需要处理。CE6.3 的编译器通常是 GCC 或自研工具链输出信息在 po 文件或内置字符串表中。如果工具链支持 gettext可以直接替换 mo 文件否则需要修改源码中的printf字符串并重新编译。运行时区域设置通过setlocale函数控制在程序入口处调用setlocale(LC_ALL, chs)或setlocale(LC_ALL, zh_CN.GBK)可以影响日期、数字格式和部分系统提示。注意不是所有嵌入式运行时都支持完整 locale如果目标板存储空间紧张可以只保留 LC_MESSAGES 类别。3. 从零构建 CE6.3 中文版的最小操作流程3.1 环境准备与工具选型动手之前需要准备一套隔离环境避免污染原始安装。推荐用虚拟机或容器把 CE6.3 安装到独立目录。工具方面资源编辑用 Resource Hacker 或 wxHexEditor编码转换用 iconv 或 Python 脚本字体替换用 FontForge 查看字形覆盖。如果 CE6.3 基于 Eclipse还需要处理 plugin.properties 和 messages.properties 文件。选型原则优先用文本方式处理配置文件二进制资源只在必要时改且每次修改前备份原文件。我一般会建一个backup/目录按时间戳保存原始文件这样翻车了能快速回滚。3.2 字符串表批量替换的完整脚本假设已经用 Resource Hacker 导出了字符串表为strings.csv格式是ID,English。下面脚本读取映射表生成替换后的资源脚本并调用资源编译器重新打包。# batch_replace.py # 读取原始字符串表和翻译表生成 Resource Hacker 可导入的 .rc 片段 import csv # 原始字符串表ID, English original {} with open(original_strings.csv, r, encodingutf-8) as f: for row in csv.reader(f): if len(row) 2: original[row[0]] row[1] # 翻译表English, Chinese translation {} with open(translation.csv, r, encodingutf-8) as f: for row in csv.reader(f): if len(row) 2: translation[row[0]] row[1] # 生成 .rc 片段 with open(replace.rc, w, encodinggbk, errorsreplace) as f: for sid, eng in original.items(): if eng in translation: chn translation[eng] # 转义双引号和反斜杠 chn_escaped chn.replace(\\, \\\\).replace(, \\) f.write(fSTRINGTABLE\nBEGIN\n {sid} {chn_escaped}\nEND\n) print(replace.rc 已生成用 Resource Hacker 导入并重新编译)逻辑说明脚本建立两个字典按英文原文匹配翻译。sid是字符串资源 ID必须与原始资源一致否则替换会错位。转义处理是为了防止中文里的引号破坏 rc 文件语法。生成的文件用 Resource Hacker 的 Action - Add from script 导入然后保存为新的 exe 或 dll。参数注意如果原始资源有多个语言块需要指定LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED否则可能替换到英文块上。3.3 对话框布局的自动调整字符串变长后对话框上的静态文本和按钮需要重新布局。手工调整几十个对话框不现实可以用 Python 解析 rc 文件中的对话框定义按控件类型和文本长度自动增加宽度。# adjust_dialog.py # 解析 .rc 文件中的对话框定义按文本长度调整控件宽度 import re def adjust_dialog(rc_content): # 匹配 DIALOGEX 块中的控件定义 pattern re.compile( r(PUSHBUTTON|DEFPUSHBUTTON|LTEXT|RTEXT|EDITTEXT)\s([^]*)\s*,\s*(\w)\s*,\s*(\d)\s*,\s*(\d)\s*,\s*(\d)\s*,\s*(\d), re.IGNORECASE ) def repl(m): ctype, text, cid, x, y, w, h m.groups() # 中文字符按 2 倍宽度估算 chinese_count sum(1 for ch in text if \u4e00 ch \u9fff) estimated_width len(text) chinese_count * 8 new_w max(int(w), estimated_width) return f{ctype} {text}, {cid}, {x}, {y}, {new_w}, {h} return pattern.sub(repl, rc_content) with open(dialogs.rc, r, encodinggbk) as f: content f.read() new_content adjust_dialog(content) with open(dialogs_adjusted.rc, w, encodinggbk) as f: f.write(new_content)逻辑说明正则匹配对话框中的按钮和文本控件提取文本内容、坐标和宽度。chinese_count统计汉字数量每个汉字按 8 个对话框单位估算额外宽度经验值具体取决于字体。new_w取原始宽度和估算宽度的较大值保证不缩小原有布局。这个脚本不能处理所有情况比如控件之间有对齐关系时加宽一个可能压到另一个所以生成后仍需人工抽查关键对话框。3.4 编译输出与帮助文档的汉化编译器的输出信息通常在messages目录下的.po或.msg文件中。如果 CE6.3 使用 GCC可以找到gcc/po/目录用 msgfmt 编译 mo 文件。帮助文档如果是 HTML 或 CHM直接替换对应语言目录下的文件。注意帮助文档的索引文件.hhc、.hhk也需要同步翻译否则搜索功能会失效。运行时库的报错信息在 libc 或 newlib 的 locale 文件中替换后需要重新编译目标库并烧录到板子。这一步的坑在于有些报错信息是硬编码在二进制里的没有源码无法修改只能接受或绕过。4. CE6.3 中文版避坑与常见问题排查4.1 界面乱码编码不一致的连锁反应现象汉化后菜单显示为问号或方块但部分对话框正常。原因不同资源文件的编码不统一有的用 GBK有的用 UTF-8而程序运行时按系统默认代码页解析。解决用file -i命令检查每个修改过的文件编码统一转为 GBK。如果程序支持 UTF-8则全部转 UTF-8 并在入口处设置setlocale(LC_ALL, zh_CN.UTF-8)。注意Windows 平台和 Linux 平台的默认代码页不同跨平台项目要分别处理。4.2 对话框截断长度估算过于乐观现象按钮文字显示为 确... 或 取消 变成 取...。原因自动调整脚本按字符数估算宽度但汉字实际渲染宽度受字体和 DPI 影响估算值偏小。解决把估算系数从 8 调到 10并在关键对话框上手工验证。另一个方法是把按钮样式从固定宽度改为自适应但需要修改资源脚本中的样式位。我一般会在调整后跑一遍界面截图对比用图像 diff 工具找出截断位置。4.3 编译报错字符串资源 ID 冲突现象重新编译资源后程序启动时报 Resource not found 或菜单项消失。原因替换脚本生成的资源 ID 与原始资源冲突或者覆盖了系统保留 ID。解决替换前导出完整资源 ID 列表确保新 ID 不在保留范围内通常 0-100 是系统保留。如果使用 Resource Hacker 导入选择 Add 而不是 Replace让工具自动分配新 ID 并更新引用。更稳妥的做法是只修改字符串内容不新增资源条目。4.4 运行时崩溃locale 设置不当现象程序启动后立即崩溃日志显示setlocale返回 NULL。原因目标板没有安装对应的 locale 数据或者 locale 名称拼写错误。解决先用locale -a查看可用 locale如果没有zh_CN.GBK需要从工具链的 locale 目录拷贝或生成。嵌入式环境通常只保留C和POSIX可以退而求其次用setlocale(LC_ALL, )让系统根据环境变量自动选择或者只设置LC_MESSAGES为zh_CN。4.5 帮助文档搜索失效索引未同步现象帮助文档内容已汉化但搜索关键词找不到结果。原因CHM 的索引文件.hhk和目录文件.hhc仍是英文搜索时按英文关键词匹配。解决用 HTML Help Workshop 重新生成索引或者手工编辑.hhk文件把中文关键词加入。如果文档是 HTML 格式检查searchindex.js或类似文件是否包含中文词条。这个坑很隐蔽因为界面看起来正常只有搜索时才暴露。5. 进阶用脚本自动化验证汉化覆盖率汉化做完后怎么确认没有遗漏手工点菜单不现实可以用脚本自动提取所有界面字符串与翻译表比对计算覆盖率。下面脚本扫描 exe 和 dll 中的字符串资源输出未翻译条目。# coverage_check.py # 用 pefile 库提取 exe/dll 中的字符串资源与翻译表比对 import pefile import csv # 加载翻译表 translated set() with open(translation.csv, r, encodingutf-8) as f: for row in csv.reader(f): if len(row) 2: translated.add(row[0]) # 扫描 PE 文件 pe pefile.PE(ce63_main.exe) untranslated [] if hasattr(pe, DIRECTORY_ENTRY_RESOURCE): for entry in pe.DIRECTORY_ENTRY_RESOURCE.entries: if entry.id pefile.RESOURCE_TYPE[RT_STRING]: for res in entry.directory.entries: for lang in res.directory.entries: data pe.get_data(lang.data.struct.OffsetToData, lang.data.struct.Size) # 解析字符串表这里简化处理实际需要按块解析 text data.decode(utf-16-le, errorsignore) for word in text.split(\x00): if word and word not in translated and any(c.isalpha() for c in word): untranslated.append(word) print(f未翻译条目数{len(untranslated)}) for item in untranslated[:20]: print(item)逻辑说明用pefile解析 PE 文件的资源目录定位 RT_STRING 类型。get_data读取原始数据按 UTF-16 解码后分割字符串。translated集合存放已翻译的英文原文不在集合中且包含字母的条目视为未翻译。参数注意errorsignore防止解码中断[:20]只打印前 20 条避免刷屏。这个脚本的局限是只能处理标准字符串表对于硬编码在代码中的字符串无能为力但能覆盖 80% 的界面文本。覆盖率检查之外还有一个实用技巧用diff对比汉化前后的资源文件生成变更报告。这样每次修改后都能快速确认改了哪些条目避免误改。我习惯在每次发布前跑一遍覆盖率脚本确保新增功能没有引入未翻译的英文。这个习惯帮我省了很多后悔药——有一次版本更新后新加的对话框全是英文因为开发直接用了新字符串没走翻译流程。覆盖率脚本一跑就发现了。最后说一个验证方法在目标板上跑一遍完整流程从新建项目、编译、烧录到调试每个环节截图与英文版对比。重点看报错信息和状态栏提示这些地方最容易遗漏。如果条件允许找一位不熟悉英文的同事试用记录他卡住的步骤那些就是汉化没做到位的地方。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Flutter视频列表实战:ListView中播放器管理与性能优化

Flutter视频列表实战:ListView中播放器管理与性能优化

1. 从零拆解一个视频列表:为什么ListView里塞播放器没那么简单 短视频刷多了,很多人第一反应是“列表加播放器,能有多难”。真动手在Flutter里做一个视频列表,你会发现事情远没有想象中那么顺。列表要滚动、视频要播放、播放器要复…

2026/10/17 12:31:54 阅读更多 →
PCI-6220数据采集卡从入门到实战:接线、驱动与采样率全解析

PCI-6220数据采集卡从入门到实战:接线、驱动与采样率全解析

PCI-6220这张卡,称得上数据采集圈子里的一块经典“老熟人”。干我们这行的人,只要在实验室、产线或者高校设备仓库里混过几年,大概率都见过那块墨绿色板卡。16路模拟输入、16位分辨率、250kS/s聚合采样率,配合24路数字IO和2路计数…

2026/10/17 12:30:53 阅读更多 →
HttpServletResponseWrapper:Filter响应改写实战

HttpServletResponseWrapper:Filter响应改写实战

做Java Web的朋友,只要在Filter里处理过响应内容,基本都撞过同一堵墙:想统一给接口响应加个版本号、替换一段敏感词、给HTML注入一份统计脚本,或者单纯想拿到响应体打日志。于是顺手在chain.doFilter()后面直接response.getOutput…

2026/10/17 12:30:53 阅读更多 →

最新新闻

强化学习策略优化:从单调提升理论到TRPO/PPO工程实践

强化学习策略优化:从单调提升理论到TRPO/PPO工程实践

强化学习学到这个阶段,大部分公式推导和代码实现都能跑通了,但有一类问题始终绕不过去:理论上讲,策略优化的目标应该让性能越改越好,实际训练里却经常出现"越改越差"。这个问题的系统解答,就是 M…

2026/10/17 13:30:35 阅读更多 →
BiliTools B站下载工具完整教程:视频、番剧、弹幕、无损音乐一次存进本地

BiliTools B站下载工具完整教程:视频、番剧、弹幕、无损音乐一次存进本地

BiliTools B站下载工具完整教程:视频、番剧、弹幕、无损音乐一次存进本地 【免费下载链接】BiliTools 本项目已停止维护。 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 你想把一部番剧留在自己硬盘里,客户端却只给"缓存…

2026/10/17 13:30:35 阅读更多 →
Vue3+TypeScript实现MD5加密解密工具:算法原理与工程实践

Vue3+TypeScript实现MD5加密解密工具:算法原理与工程实践

做开发这些年,MD5 大概是碰得最频繁的“加密”工具之一。测接口签名、校验文件完整性、给测试数据造个定长指纹,随手就是一个 md5()。但真正要把这东西做成一个能上线的工具,尤其是用 Vue 3 和 TypeScript 从零写一个带“加密/解密”能力的在…

2026/10/17 13:30:35 阅读更多 →
DouK-Downloader 完整指南:5 分钟跑通抖音 / TikTok 视频下载与归档

DouK-Downloader 完整指南:5 分钟跑通抖音 / TikTok 视频下载与归档

DouK-Downloader 完整指南:5 分钟跑通抖音 / TikTok 视频下载与归档 【免费下载链接】TikTokDownloader 抖音 / TikTok 平台作品下载/数据采集工具 项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader 想把这个账号的所有作品一次归档&…

2026/10/17 13:30:35 阅读更多 →
数字员工工作流实战:从IT工单到财务报销的可交付落地指南

数字员工工作流实战:从IT工单到财务报销的可交付落地指南

1. 这不是又一个“AI Agent教程”,而是一套可跑通、能交付、真落地的数字员工工作流 最近在几个技术社区和企业内训现场,反复被问到一个问题:“Hermes Agent到底能不能用?不是概念演示,是真能替人干活的那种。”我试过…

2026/10/17 13:30:35 阅读更多 →
2025人工智能指数报告解读:从趋势数据到工程决策

2025人工智能指数报告解读:从趋势数据到工程决策

简介:这份2025年人工智能指数报告由斯坦福大学人类中心人工智能研究所发布,是第八版AI指数报告,旨在为政策制定者、研究人员、企业高管、记者及公众提供关于全球AI发展态势的权威数据参考。压缩包内为1个PDF文件,大小29.46MB&…

2026/10/17 13:29:34 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →