字符编码与乱码排查:从ASCII到UTF-8的完整指南
1. 从一次乱码事故说起为什么基础笔记绕不开字符编码我自己做技术这些年最怕听到的一句话不是“系统崩了”而是“数据变成乱码了”。尤其是做那种跨系统的对接项目最漂亮的数据表只要换一个环境打开中文全变成“锟斤拷”或者一长串问号瞬间心态炸裂。我在计算机基础笔记系列里专门安排一篇写字符编码不是因为它“考纲里重要”而是因为只要你还在写代码、导数据、操作数据库这个问题迟早会找上门。这一篇笔记我把它定位成一张“编码世界观地图”。我不会只给你背 ASCII 码表也不会堆一长串没人记得住的规范文档。我想讲清楚三件事计算机底层到底是怎么表示文字的为什么会有那么多种让人崩溃的编码方案以及当你真的遇到乱码时应该沿着什么样的思路一步步把它揪出来。适合谁看写给那些已经写过一些代码、但一遇到中文乱码就靠搜索引擎碰运气的同学也适合准备系统复习基础知识的开发者看看。先给一个真实的体验做引子有一次我在做一个数据对接的模拟项目X源系统导出一份 CSV我用脚本一读终端里整整齐齐地看着没事随手传到服务端一解析中文全部变成“??????”。当时我第一反应是“文件坏了”后来才意识到这根本不是文件坏了是编码信息在传递的链条上断了一环。乱码不是数据丢了而是数据的“解释方式”错了。所以这篇笔记就是帮你建立这样一条排查链路看到乱码不再慌先问“数据原本是按什么规则解释的”再问“我的程序现在按什么规则解释的”两者不一致修正一边就行。听起来简单但真做起来会踩不少坑我尽量把坑都指给你看。2. 编码的“前世”ASCII、区位码与早期中文编码的取舍逻辑2.1 从 ASCII 开始理解“字符要变成数字”计算机不认识“字”它只认识高低电平转换成逻辑表达就是 0 和 1。要让英文字母进计算机就必须给每个字母分配一个编号这个编号再被翻译成二进制存储。ASCII 就是最早也最成功的“字母-数字”对照表大写 A 是 65小写 a 是 97数字 0 到 9 是 48 到 57。ASCII 一个字符占一个字节标准版只用了 7 位也就是 0 到 127。为什么是 7 位而不是 8 位因为在早期传输环境里多出来的那一位常被用作奇偶校验。这件事也埋下了隐患剩下的 128 个位置本来可以承载更多语言符号但各家对“扩展 ASCII”的定义却不统一拉丁字符、制表符、希腊字母各搞各的互相看不懂。真正让我觉得 ASCII 值得记住的是它的“连续性”。大写字母从 65 开始连续排小写从 97 开始连续排所以“判断一个字符是不是大写字母”在代码里可以直接用区间比较而不需要一个一个枚举。这种设计的“便宜”之处许多新人在写字符串处理逻辑时未必意识到。2.2 区位码与 GB 系列中文是怎么被塞进字节的中文的字符数量决定了它不可能拿一个字节搞定。常用汉字几千个加上生僻字、标点符号需要更大的编码空间。于是早期中文编码选择了一条很务实的路两个字节表示一个汉字。我刚开始学的时候对“区位码”的概念很困惑。后来找到了一个直观类比想象一张 94 行 94 列的大表格行叫“区”列叫“位”每个格子放一个汉字“中”字就住在 54 区 48 位。这个区位码本身不是最终存储编码而是给设计字符集的人用的一个“坐标系统”。在区位码基础上工程上做了偏移处理把汉字安排在 ASCII 字符的可显示范围之外形成了 GB2312。这套方案覆盖了六千多个常用汉字和符号足够应付绝大多数日常场景。后来为了支持繁体中文和更多生僻字又有了 GBK 和 GB18030。GBK 向下兼容 GB2312GB18030 则进一步变成变长编码可以和 Unicode 做完整的映射。这里有个值得记住的点GBK、GB2312 这类方案里英文字符还是用一个字节表示和 ASCII 一致只有中文字符才动用两个字节。所以一段夹杂中英文的 GBK 文本解析时看到某个字节落在 ASCII 范围就单独读读到高字节再往后多取一个字节整体上是一种“带状态”的解析。2.3 为什么早期会形成“编码孤岛”站在今天的视角可能很难理解当初为什么不直接做一个“全世界统一编码”。但要知道在几十年前网络还不发达汉字编码主要服务本地需求设计目标是“节省存储、方便检索、兼容自家已有标准”而不是“和另一个国家无缝交换数据”。这就导致了编码孤岛中文有 GB 系和 Big5日文有 Shift_JIS韩文有 EUC-KR。各家在自己的地盘里运行良好但一旦数据跨系统流动字符的解释规则不共用乱码就不可避免。理解了这段历史你就会明白很多乱码问题本质上不是“数据损坏”而是“解码规则对不上”。这也是为什么后面要引入 Unicode 这样一个“统一编码方案”来收拾局面。3. UTF-8 为何能统一江湖变长编码的底层设计3.1 Unicode 的目标不是“编码”而是给字符发身份证Unicode 做的事情在我看来更像是一个“户口登记系统”给全世界绝大多数语言的每个字符分配一个唯一的码点code point比如“中”字的码点就是 U4E2D。关键一步是Unicode 只管“这个字符的数字 ID 是多少”它并不规定这个 ID 在文件里应该用几个字节、按什么规则存储。同一个码点可以有好几种“序列化”方式也就是不同的编码方案。这就把“字符身份”和“字节存储形式”两个概念彻底分开了。理解这个区别特别重要。我见过不少同学一听到“Unicode 编码”就默认为“每个字符一定占两个字节”这就是把概念混在一起了。U4E2D 表示“中”这个身份而存储成 UTF-16 可能是两个字节存储成 UTF-8 则是三个字节。3.2 UTF-8 的字节规则一眼认出变长编码怎么工作UTF-8 的设计堪称教科书级别。它规定一个字符的码点不同范围对应的字节数不同而且每个字节的前缀比特写明了“这个字节是单字节字符、多字节序列的开头、还是后续字节”。我把规则简化成一张表码点范围对应字节数二进制模板U0000 到 U007F1 字节0xxxxxxxU0080 到 U07FF2 字节110xxxxx 10xxxxxxU0800 到 UFFFF3 字节1110xxxx 10xxxxxx 10xxxxxxU10000 到 U10FFFF4 字节11110xxx 10xxxxxx 10xxxxxx 10xxxxxx怎么理解这张表以汉字“中”为例码点是 U4E2D落在第三段所以 UTF-8 用三个字节存储。第一个字节的前缀是 1110表示“这是一个三字节序列的开头”后面两个字节前缀都是 10表示“我是后续字节”。剩下的比特位把 4E2D 的二进制拆开填进去最终得到三个十六进制字节E4 B8 AD。这种设计有几个隐性的优点。第一ASCII 文本在 UTF-8 下和原来的字节完全一样这一点让老系统几乎可以无痛切换。第二解析 UTF-8 时如果中间某个字节断了根据前缀规则很快就能发现数据异常具备一定的自我校验能力。第三它按码点大小变长英文多、中文少的场景下文件体积控制有优势。3.3 UTF-16、BOM以及那个总被误解的“字节序”UTF-8 虽然现在是事实标准但你在一些场景里还会撞见 UTF-16尤其是某些系统内部处理字符串的时候。UTF-16 的规则是常用平面内的字符用两个字节表示超过常用平面的字符用四个字节通过代理对机制。这里就引出一个“大端还是小端”的问题两个字节按什么顺序存放于是就有了 BOMByte Order Mark这个概念。BOM 的本质是文件开头的一段特殊标记用来告诉解析者“我是按大端还是小端存的”。UTF-8 本身不存在字节序问题但有些软件习惯在 UTF-8 文件开头也加一个 EF BB BF 标记相当于“我是一个 UTF-8 文件”。问题在于并不是所有解析器都认识这个标记有时候它会被当成一个隐形字符出现在字符串开头变成一道诡异的“问号”或者空格。我调试过很多次“为什么第一个字符总是不对”根因就是 BOM。所以现在我在处理跨系统文本时会先确认文件的 BOM 情况能不用就不用特别在服务端解析用户上传文件时BOM 往往是个可以提前规避的坑。4. 真实排查链路一个跨平台数据导入项目的乱码追踪全过程4.1 现象描述文件在本地正常上传后一锅粥为了把排查思路讲完整我用一个具体的模拟项目X来复现。项目场景很简单某数据平台需要从外部系统导入一批 CSV 文件文件里有中文姓名、备注信息等内容。外部系统跑在一套老环境中导出的文件头部信息我第一眼没看出问题用本地工具打开也正常。可一旦通过后端脚本读取再写进数据库中文就变成了“?????????”或者类似“测试”这种奇怪的拉丁字符组合。我第一次遇到“测试”这种形态时完全不知道它从哪来的。后来才知道这类乱码通常意味着“本来是 UTF-8 编码的中文被用 Latin-1 或者其他单字节编码解读了”。换句话说字节还是那些字节但解释文字的“字典”拿错了。4.2 第一步先别瞎猜用工具判定文件的真实编码排查乱码时我的原则是先确认“字节层面到底是什么”再谈“怎么转”。靠肉眼猜编码成功率不高。Linux 或 macOS 环境下可以直接用 file 命令看file -i messy_file.csv如果返回类似charsetutf-8说明文件头信息还算干净。如果返回charsetiso-8859-1或者us-ascii那就说明编码识别出了偏差。更精细的做法是用 Python 的 chardet 库做一次启发式探测import chardet with open(messy_file.csv, rb) as f: raw_data f.read(10000) result chardet.detect(raw_data) print(result)chardet 不是百分之百准确但它能给一个很好的起点。比如检测结果可能显示GB2312或GBK这就把方向带到了“中文双字节编码”上。4.3 第二步复现问题写出“错误解释”的证据确定文件源头比较像 GBK 之后我开始复现后端脚本里的读取逻辑。问题代码大概是这样的with open(messy_file.csv, r, encodingutf-8) as f: lines f.readlines()如果文件实际上是 GBK 编码用 UTF-8 解码大部分汉字会直接抛解码错误但如果文件里恰好只有部分字节能通过 UTF-8 校验就会产生乱码而不是报错。这就是为什么乱码问题有时“不报错只出错”。我把读取方式改成二进制直接按字节看关键位置with open(messy_file.csv, rb) as f: raw f.read(200) print(raw.hex())这一看就清楚了某个中文字符的位置不是单个字节而是连续两个高字节。对照 GBK 的字节范围基本确定这个文件是按 GBK 编码存的。4.4 第三步绕开“二次转换”一次性统一标准修复方案看起来很简单把文件从 GBK 转成 UTF-8 再处理。但实操时有个隐蔽陷阱如果先把二进制按 GBK 解码成 Python 字符串再对字符串调用 encode(utf-8)这是正确的。可如果一开始就用错误编码把字符串解出来比如先按 latin-1 解再试图换成 utf-8就会造成“二次转换”数据直接损坏。我当时用的正确姿势是with open(messy_file.csv, rb) as f: raw f.read() text raw.decode(gbk, errorsstrict) with open(fixed_file.csv, w, encodingutf-8, newline) as f: f.write(text)注意 decode 时用的 errors 参数我特意写成了strict这是为了在转换过程的早期暴露问题而不是让问题悄悄溜进下游。如果这里报错说明我的“文件是 GBK”假设可能不够准需要再探测一下而不是强行继续。4.5 第四步数据库端字符集设置也不可忽视文件整理好之后事情还没有结束。数据写进数据库时如果表的字符集设置不对照样会变成“问号”或者“乱码”。我在这个模拟项目X里就遇到过文件已经转成了标准的 UTF-8但某关系型数据库的连接串里没有指定字符集默认走了 latin1结果入库后又乱了一遍。正确的做法是链路全过程统一字符集前端声明、HTTP 请求头、后端读取编码、数据库连接参数、表字段字符集全部对齐到 UTF-8。每一个环节都像是一段水管只要有一段口径不对水就会漏。给你的生产环境做一次“编码链路盘点”比写一百个转码函数都管用。5. 落地自查常用编码场景的避坑建议与快速验证方法5.1 文件与编辑器把“保存编码”当成默认设置去检查很多人写代码时根本不看编辑器的右下角默认用 UTF-8 保存这本身没问题。但一旦接手老项目你会发现有的源码文件其实是 GBK 保存的编译器或解释器还能顺利跑是因为工程环境里配置了对应的编码选项。这时候如果你想在代码里新增一句带中文注释保存编码和原文件不一致就可能把整个文件搞坏。我的建议是在团队协作里把“所有源文件统一为 UTF-8无 BOM”写进检查规则。可以用一个简单的脚本扫一遍所有文本文件检测有没有非 UTF-8 字节grep -rIl $\xEF\xBB\xBF ./src | head -20这只能粗略查 BOM 标记更严格的验证可以用 Pythonfrom pathlib import Path for p in Path(./src).rglob(*): if p.suffix in {.py, .js, .java, .txt, .md}: try: p.read_text(encodingutf-8) except UnicodeDecodeError: print(fnon-utf8 detected: {p})5.2 数据传输与接口不要在 HTTP 层丢失编码信息接口调用过程中编码信息通常写在后端返回的 Content-Type 头里。一个完整的返回头应该像这样Content-Type: application/json; charsetutf-8如果漏掉了charsetutf-8一部分解析器可能默认按 ISO-8859-1 解中文自然就乱了。客户端在发送表单数据时表单的 accept-charset 和实际提交内容也要保持一致。我踩过的另一个坑是 JSON 里的中文被前端错误地再做了一次 URL 编码。很多同学看到字符串变成 %E4%B8%AD以为这是乱码其实这是正常的 URL 编码形式Decode 之后内容还是完好的。排查时不要看到百分号就慌。5.3 终端与日志显示乱码并不等于数据损坏有时候数据在内存里完全正常只是终端窗口显示不出来。比如 Windows 的默认代码页可能是 936GBK用某个工具打出的 UTF-8 中文在控制台里就成了乱码。这不代表程序写错了而是“显示环境”和“数据编码”不匹配。遇到这种情况我现在的习惯是先不折腾代码先把输出重定向到文件再用支持编码切换的编辑器看。或者在 Python 里加一句import sys sys.stdout.reconfigure(encodingutf-8)处理完再重新运行往往就正常了。把“显示层”和“数据层”分开考虑能帮你减少无谓的焦虑。5.4 快速自查表常见场景对照场景易错点建议源文件注释多人编辑导致保存编码不一致统一 UTF-8 无 BOM加静态检查CSV/Excel 导入文件实际编码与解析编码不符先探测后转码全程显式指定编码数据库写入连接串未指定 charset表字段字符集不统一链路全部对齐 UTF-8/utf8mb4HTTP 接口响应头漏掉 charset显式返回charsetutf-8终端控制台显示编码与数据编码不匹配先重定向文件确认数据再调终端文件名传输压缩包跨系统解压后文件名乱码尽量用拼音或英文文件名或使用支持编码修复的工具这张表不是为了列完所有可能而是提醒你编码问题几乎总出现在“边界”——文件边界、网络边界、系统边界。边界上的编码声明一旦缺失就会默认用各自系统的习惯猜猜错了就是乱码。6. 最后分享两个我自己的防御习惯第一凡是接受外部输入的程序我在第一行就会把“原始字节”完整地保一份存起来日志里记下编码探测结果。这样真出了问题不需要重新等现场复现翻日志就能定位是哪个环节解释错了。这比反复调试省太多时间。第二写代码时显式指定编码绝不依赖系统默认值。Python 打开文件顺手写encodingutf-8数据库连接串里带上charset参数HTTP 工具里加Accept-Charset头。虽然表面上看只是几行字的功夫但遇到问题时你会感谢这些“多此一举”的声明。字符编码这件事最大的难点不在“规则多”而在“大多数时候它不报错只是悄悄把数据变样”。一旦习惯用“字节-解码规则-显示层”三层视角看问题绝大多数乱码都能在五分钟内定位。把这篇笔记里提到的排查链路走一遍以后再遇到乱码你也能从“看见乱码就发怵”变成“哦这就是编码映射错了”。

相关新闻

生成式AI最佳实践报告:从榜单到落地的四步复现方法

生成式AI最佳实践报告:从榜单到落地的四步复现方法

简介:沙利文联合头豹研究院发布的《2024年中国生成式AI行业最佳应用实践》报告,是一份面向企业高管、技术人员、研究人员与政策制定者的行业评估指南。报告系统梳理了生成式AI的技术特点与评选标准,并基于完整评选流程筛选出各行业最佳应用实…

2026/10/11 10:50:23 阅读更多 →
REA模型实战:用资源-事件-代理重构企业核心数据系统

REA模型实战:用资源-事件-代理重构企业核心数据系统

先说个有意思的事:我们内部这个项目的代号就叫 "rea",全称拆开是 Resources-Events-Agents,也就是"资源-事件-代理"模型。最早听到这个名字的人都会愣一下,以为是什么缩写拼错了,但实际用下来你会…

2026/10/11 10:49:23 阅读更多 →
影刀RPA新手教程:运行日志三层记录法——出问题3分钟定位

影刀RPA新手教程:运行日志三层记录法——出问题3分钟定位

影刀RPA新手教程:运行日志三层记录法——出问题3分钟定位 流程半夜挂了,第二天打开一看只有一句"执行异常",具体挂在哪一步、数据长什么样、当时页面是什么状态,全都不知道——这种抓瞎的感觉,我头一年至少经…

2026/10/11 10:49:23 阅读更多 →

最新新闻

SpringBoot+Vue+MySQL工资信息管理系统:从数据库设计到答辩全攻略

SpringBoot+Vue+MySQL工资信息管理系统:从数据库设计到答辩全攻略

每年到了毕业设计选题季,后台收到最多的问题几乎都是同一个:有没有一个项目,技术栈主流、业务不算复杂、做起来工作量适中、答辩时还拿得出手?如果你恰好也在找这个答案,那基于 SpringBoot、Vue、MySQL 的工资信息管理…

2026/10/11 11:43:13 阅读更多 →
一周新增 2,533 颗星、总星数 129k:MoneyPrinterTurbo 热度数据全解读

一周新增 2,533 颗星、总星数 129k:MoneyPrinterTurbo 热度数据全解读

一周新增 2,533 颗星、总星数 129k:MoneyPrinterTurbo 热度数据全解读 【免费下载链接】MoneyPrinterTurbo 利用 AI 大模型和自动化工作流,根据主题或关键词一键生成高清短视频。Generate HD short videos from a topic or keyword with an automated AI…

2026/10/11 11:43:13 阅读更多 →
Win32 字体处理实战:字符度量、枚举筛选与 DPI 适配

Win32 字体处理实战:字符度量、枚举筛选与 DPI 适配

作为常年跟 Win32 打交道的人,我始终觉得字体这块是 GUI 开发里最容易被低估的环节。很多界面看着别扭,问题并不出在布局算法上,而是对“系统字体与字符大小”的理解还停留在“选个字号就行”的层面。这一章我把这些年积累的字体处理经验完整…

2026/10/11 11:43:13 阅读更多 →
ContentUnavailableView 教程:SwiftUI 空状态设计的完整指南

ContentUnavailableView 教程:SwiftUI 空状态设计的完整指南

【免费下载链接】SwiftUI-Agent-Skill SwiftUI agent skill for Claude Code, Codex, and other AI tools. 项目地址: https://gitcode.com/GitHub_Trending/swi/SwiftUI-Agent-Skill 点击查看 免费下载 ContentUnavailableView 是 SwiftUI 内置的系统级"空状…

2026/10/11 11:43:13 阅读更多 →
C#台账系统设计:实现可追溯、防篡改的企业级数据记录

C#台账系统设计:实现可追溯、防篡改的企业级数据记录

简介:这是一套基于C#开发的轻量级台账记录系统设计源码,面向中小型组织、企业行政或财务人员及C#初学者,解决日常台账录入、查询、修改与删除等基础管理需求。资源共67个文件,压缩包大小384KB,包含41个核心C#源文件&am…

2026/10/11 11:43:13 阅读更多 →
StealthChop+如何让步进电机逼近BLDC性能

StealthChop+如何让步进电机逼近BLDC性能

1. 为什么说“步进电机的天花板”正在被重新定义?最近在某高校机电实验室调试一台高精度3D打印平台时,我遇到一个典型矛盾:客户要求Z轴在0.01mm级微动下完全静音、无振动,同时还要在快速回零时保持200mm/s的瞬时加速度。传统细分驱…

2026/10/11 11:42:13 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →