ZIP 中文文件名乱码修复:从编码原理到跨平台解压实战
简介这是一份面向C开发者的ZIP压缩库源码资源专门解决ZIP文件中中文文件名解压后显示为乱码的常见问题。标准ZIP库通常不支持Unicode编码处理含中文字符的文件时容易出现编码错乱该库通过内置编码转换逻辑修复了这一缺陷适合需要在项目中读写中文文件名压缩包的开发者使用。压缩包共4个文件包含2个cpp源文件与2个h头文件分别承担压缩、解压的具体实现与接口声明整体约79KB体积轻量便于直接集成到现有工程。目前已有2181人学习下载说明其在中文编码处理场景中具有一定实用价值。借助这套源码读者可以了解ZIP文件打开、遍历、读写及UTF-8与本地编码互转的实现思路掌握在C项目中规避中文乱码的排错方法并参考配套教程完成编译配置与函数调用快速将库接入自己的文件处理流程。1. 文件名中文乱码一个被低估的交付事故你肯定遇到过这种场景同事发来一个压缩包解压后文件名全变成н¨Îļþ¼Ð这样的乱码或者更离谱的新建文件夹。这不是文件损坏是编码在打架。ZIP 格式诞生于 1989 年那个年代没人考虑 Unicode文件名用本地代码页存储。Windows 中文环境用 GBKmacOS 和 Linux 默认 UTF-8两边一碰就翻车。更麻烦的是ZIP 规范里有个 general purpose bit 11标记文件名是否为 UTF-8但大量老工具根本不设这个位。结果就是同一个 zip 包在 Windows 上解压正常传到 Linux 服务器上就乱码用 Java 的ZipInputStream读出来是乱码用 7-Zip 打开又正常。这个问题在跨平台交付、自动化流水线、后端批量处理场景里极其常见尤其是做文件服务、数据导出、CI/CD 制品归档的团队。下面我把这个问题的根因、检测方法、修复方案和踩过的坑一次讲清楚代码可以直接抄。2. ZIP 文件名编码的底层逻辑为什么偏偏是中文出事2.1 ZIP 规范里的编码盲区ZIP 的文件名存在 local file header 和 central directory 两处格式是变长字节串规范原文只说“文件名”没规定编码。PKWARE 后来在 APPNOTE 里补了 bit 11EFSEnhanced File System置 1 表示文件名是 UTF-8。但问题是很多打包工具尤其是 Windows 上的老版本资源管理器、部分 Java 库不设这个位即使设了解压端也可能忽略中文在 GBK 里是双字节在 UTF-8 里是三字节字节序列完全不同一旦用错解码器就是乱码ASCII 文件名为什么没事因为 ASCII 在 GBK、UTF-8、Latin-1 里编码一致单字节兼容。中文、日文、韩文这类多字节字符才是重灾区。2.2 乱码的两种典型形态第一种新建文件夹。这是 UTF-8 字节被当成 Latin-1 解码的典型结果。原始“新建文件夹”的 UTF-8 字节是E6 96 B0 E5 BB BA...每个字节被 Latin-1 映射成一个字符就变成了新建...。这种乱码可逆用latin1编码回去再utf8解码就能还原。第二种н¨Îļþ¼Ð。这是 GBK 字节被当成 Latin-1 或 CP1252 解码的结果。“新建文件夹”的 GBK 字节是D0 C2 BD A8...被 Latin-1 映射后就是н¨...。这种也可逆但前提是你知道原始编码是 GBK。不可逆的情况UTF-8 字节被当成 GBK 解码。因为 GBK 解码器遇到非法字节序列会替换成?或锟斤拷信息直接丢失。这就是为什么有些乱码怎么转都转不回来。2.3 检测先判断这个 zip 到底用了什么编码在动手修之前必须先检测。我一般用 Python 写一个探测脚本逻辑是读取 central directory 里的原始文件名字节尝试用 UTF-8 解码如果成功且 bit 11 置位就是 UTF-8如果 UTF-8 解码失败再用 GBK 试如果都失败用chardet或charset-normalizer猜。import zipfile import chardet def detect_zip_encoding(zip_path): 检测 zip 内文件名的编码 with zipfile.ZipFile(zip_path, r) as zf: for info in zf.infolist(): # filename 在 Python zipfile 里已经被解码过 # 需要拿原始字节用 cp437 编码回去 raw_bytes info.filename.encode(cp437) # 先试 UTF-8 try: decoded raw_bytes.decode(utf-8) # 检查 bit 11 is_utf8_flag bool(info.flag_bits 0x800) print(fUTF-8 解码成功: {decoded}, bit11{is_utf8_flag}) continue except UnicodeDecodeError: pass # 再试 GBK try: decoded raw_bytes.decode(gbk) print(fGBK 解码成功: {decoded}) continue except UnicodeDecodeError: pass # 最后用检测库 result chardet.detect(raw_bytes) print(f检测结果: {result}, 原始字节: {raw_bytes}) detect_zip_encoding(test.zip)关键点Python 的zipfile模块在读取文件名时如果 bit 11 没置位会用 CP437 解码。所以info.filename.encode(cp437)能拿回原始字节。这个技巧是修复的核心。参数说明flag_bits 0x800就是检查 bit 11。chardet.detect返回置信度和编码名置信度低于 0.7 的基本不可信需要人工判断。3. 修复方案从解压端到打包端的完整链路3.1 解压端修复Python 重写文件名最常见的需求是拿到一个乱码 zip在解压时把文件名修正。核心思路是拦截zipfile的解码过程用正确的编码重新解码。import zipfile import os def extract_zip_fixed(zip_path, extract_to, src_encodinggbk): 解压 zip 并修复中文文件名 src_encoding: 原始编码常见 gbk / utf-8 / big5 with zipfile.ZipFile(zip_path, r) as zf: for info in zf.infolist(): # 拿原始字节 raw_name info.filename.encode(cp437) # 用指定编码解码 try: correct_name raw_name.decode(src_encoding) except (UnicodeDecodeError, LookupError): # 解码失败就保持原样 correct_name info.filename # 处理目录分隔符Windows 打包的可能用反斜杠 correct_name correct_name.replace(\\, /) # 构造目标路径 target_path os.path.join(extract_to, correct_name) # 目录条目 if info.is_dir(): os.makedirs(target_path, exist_okTrue) continue # 确保父目录存在 os.makedirs(os.path.dirname(target_path), exist_okTrue) # 写入文件 with zf.open(info) as src, open(target_path, wb) as dst: dst.write(src.read()) print(f解压: {info.filename} - {correct_name}) # 用法 extract_zip_fixed(乱码包.zip, ./output, src_encodinggbk)逻辑说明info.filename.encode(cp437)是拿回原始字节的关键。因为 Python 在读取时已经用 CP437 解码过一次编码回去就还原了。然后用gbk解码得到正确中文。如果原始是 UTF-8 但被误判把src_encoding改成utf-8即可。参数说明src_encoding需要根据检测结果传。如果不确定可以先跑 2.3 的检测脚本。extract_to目录必须存在或自动创建。注意info.is_dir()判断目录ZIP 里目录条目以/结尾。3.2 打包端修复生成兼容性最好的 zip如果你是自己打包发给别人最稳妥的做法是文件名统一用 UTF-8 编码并且设置 bit 11。Python 的zipfile在 Python 3.11 默认对非 ASCII 文件名设置 UTF-8 标志但老版本不会。手动控制import zipfile import os def create_zip_utf8(source_dir, zip_path): 创建 UTF-8 文件名的 zip显式设置 bit 11 with zipfile.ZipFile(zip_path, w, zipfile.ZIP_DEFLATED) as zf: for root, dirs, files in os.walk(source_dir): for file in files: file_path os.path.join(root, file) # 相对路径作为 arcname arcname os.path.relpath(file_path, source_dir) # 强制 UTF-8 编码文件名 zf.write(file_path, arcname) # 验证 bit 11 with zipfile.ZipFile(zip_path, r) as zf: for info in zf.infolist(): has_utf8 bool(info.flag_bits 0x800) print(f{info.filename}: UTF-8 flag {has_utf8}) create_zip_utf8(./my_folder, output_utf8.zip)逻辑说明Python 3.11 之后zipfile对非 ASCII 文件名会自动设 bit 11。但如果你在更早版本或者用其他语言需要手动确保。Java 的ZipOutputStream默认用平台编码需要显式setEncoding(UTF-8)。参数说明zipfile.ZIP_DEFLATED是压缩方式需要zlib模块。arcname用相对路径避免把绝对路径打进去。3.3 Java 端的处理ZipInputStream指定编码Java 项目里读 zip 乱码核心是ZipInputStream构造函数传Charsetimport java.io.*; import java.nio.charset.Charset; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class ZipReaderFixed { public static void unzip(String zipPath, String destDir, String charsetName) throws IOException { Charset charset Charset.forName(charsetName); // 如 GBK try (ZipInputStream zis new ZipInputStream( new FileInputStream(zipPath), charset)) { ZipEntry entry; byte[] buffer new byte[4096]; while ((entry zis.getNextEntry()) ! null) { File outFile new File(destDir, entry.getName()); if (entry.isDirectory()) { outFile.mkdirs(); continue; } outFile.getParentFile().mkdirs(); try (FileOutputStream fos new FileOutputStream(outFile)) { int len; while ((len zis.read(buffer)) 0) { fos.write(buffer, 0, len); } } zis.closeEntry(); } } } public static void main(String[] args) throws IOException { unzip(test.zip, ./output, GBK); } }逻辑说明ZipInputStream(InputStream, Charset)这个构造函数是关键不传的话用 UTF-8遇到 GBK 文件名就乱码。传GBK后entry.getName()返回正确中文。参数说明charsetName根据实际情况传GBK、UTF-8、BIG5。如果 zip 里混合了编码这个方案会失败需要更复杂的逐条目检测。3.4 命令行工具的选择unzip -O和 7-ZipLinux 下unzip有个-O参数指定编码unzip -O GBK 乱码包.zip -d ./output但注意不是所有unzip版本都支持-OmacOS 自带的就不支持。7-Zip 在 Windows 下右键解压通常能自动识别命令行用7z x 乱码包.zip -o./output -mcp936-mcp936指定代码页 936GBK。这个方案在 Windows 上最稳但 Linux 下需要p7zip且行为可能不一致。提示unzip -O在部分发行版需要unzip版本 6.0用unzip -v确认。不支持的话优先用 Python 脚本可控性最强。4. 避坑指南文件名乱码修复的 5 个血泪教训4.1 坑一用chardet检测单个文件名置信度极低现象写脚本用chardet.detect检测文件名编码短文件名2-4 个汉字返回的置信度经常低于 0.3甚至猜成Big5或Shift_JIS。原因chardet是统计模型需要足够长的字节序列才能准确判断。文件名太短统计特征不足。解决不要逐文件名检测。读取整个 zip 的所有文件名字节拼接起来检测或者直接用业务背景判断——国内 Windows 打包的基本是 GBKmacOS/Linux 打包的基本是 UTF-8。检测只作为辅助。4.2 坑二info.filename.encode(cp437)抛异常现象Python 脚本在某些 zip 上执行encode(cp437)报UnicodeEncodeError。原因如果 zip 的 bit 11 已经置位Python 会用 UTF-8 解码文件名此时filename是正常 Unicode 字符串encode(cp437)对中文会失败。解决先判断info.flag_bits 0x800如果置位说明已经是 UTF-8不需要修复。只有没置位时才走cp437还原逻辑。if info.flag_bits 0x800: correct_name info.filename # 已经是 UTF-8 else: raw_name info.filename.encode(cp437) correct_name raw_name.decode(gbk)4.3 坑三解压后文件名对了但文件内容损坏现象用脚本修复文件名后解压出来的文件打不开或者大小不对。原因常见于用zf.read(info)读取时如果 zip 是分卷压缩或用了不支持的压缩算法如 ZIP64、AES 加密zipfile可能读不全。解决检查info.compress_typeZIP_DEFLATED和ZIP_STORED是安全的。如果是ZIP_BZIP2或ZIP_LZMA需要 Python 3.3 且对应模块可用。加密 zip 用zipfile读不了需要pyzipper。4.4 坑四macOS 打包的 zip 在 Windows 上解压出__MACOSX目录现象解压后多出一堆__MACOSX开头的文件和._前缀的隐藏文件。原因macOS 的归档工具会写入资源分支信息这些是元数据不是乱码问题但经常和乱码一起出现。解决解压时过滤掉__MACOSX/和._开头的条目if correct_name.startswith(__MACOSX/) or /._ in correct_name: continue4.5 坑五修复后的文件名在 Windows 上仍然显示异常现象Python 脚本里打印文件名正常但解压到 Windows 磁盘后资源管理器显示乱码。原因Windows 文件系统用 UTF-16 存储文件名Python 在 Windows 上写文件时用 Unicode API理论上没问题。但如果你的脚本在 Linux 上跑写到挂载的 NTFS 或 SMB 共享中间层可能做了编码转换。解决确保脚本运行环境的locale是 UTF-8写文件时用os.fsencode/os.fsdecode兼容。跨平台传输时优先在目标平台上解压。5. 进阶技巧批量处理与自动化验证5.1 批量修复目录下所有 zip实际工作中往往不是处理一个包而是一批。写一个批量脚本自动检测编码并修复import os import zipfile import chardet def batch_fix_zip(input_dir, output_dir): 批量修复目录下所有 zip 的中文文件名 for fname in os.listdir(input_dir): if not fname.lower().endswith(.zip): continue zip_path os.path.join(input_dir, fname) out_path os.path.join(output_dir, fname.replace(.zip, )) # 先检测编码 encoding detect_encoding(zip_path) print(f{fname}: 检测编码 {encoding}) # 用检测到的编码解压 extract_zip_fixed(zip_path, out_path, src_encodingencoding) def detect_encoding(zip_path): 通过所有文件名字节投票决定编码 with zipfile.ZipFile(zip_path, r) as zf: all_bytes b for info in zf.infolist(): if info.flag_bits 0x800: return utf-8 all_bytes info.filename.encode(cp437) # 整体检测 result chardet.detect(all_bytes) if result[confidence] 0.7: return result[encoding] # 兜底试 GBK try: all_bytes.decode(gbk) return gbk except UnicodeDecodeError: return utf-8 batch_fix_zip(./zips, ./extracted)逻辑说明detect_encoding把所有文件名字节拼起来检测提高置信度。如果 bit 11 置位直接返回 UTF-8。兜底逻辑优先试 GBK因为国内场景 GBK 概率最高。参数说明input_dir和output_dir需要提前创建。chardet的confidence阈值 0.7 是经验值低于这个值就人工介入。5.2 验证修复结果三个检查点修完之后不能只看文件名要验证检查项方法通过标准文件名可读遍历输出目录打印所有文件名无?、锟斤拷、æ等异常字符文件数量一致对比 zip 内条目数和输出文件数数量相等排除目录条目文件内容完整对每个文件计算 MD5和 zip 内原始数据对比MD5 一致import hashlib def verify_extraction(zip_path, extract_dir, src_encodinggbk): 验证解压结果 with zipfile.ZipFile(zip_path, r) as zf: for info in zf.infolist(): if info.is_dir(): continue raw_name info.filename.encode(cp437) correct_name raw_name.decode(src_encoding) target os.path.join(extract_dir, correct_name) if not os.path.exists(target): print(f缺失: {correct_name}) continue # 对比 MD5 with zf.open(info) as f: zip_md5 hashlib.md5(f.read()).hexdigest() with open(target, rb) as f: disk_md5 hashlib.md5(f.read()).hexdigest() if zip_md5 ! disk_md5: print(f内容不一致: {correct_name}) else: print(fOK: {correct_name}) verify_extraction(test.zip, ./output, gbk)5.3 一个容易忽略的细节目录分隔符Windows 打包的 zip 里目录分隔符可能是\而不是/。虽然 ZIP 规范要求用/但某些工具不遵守。修复文件名时统一替换correct_name correct_name.replace(\\, /)另外文件名里可能包含..路径穿越解压前要过滤if .. in correct_name or correct_name.startswith(/): print(f跳过危险路径: {correct_name}) continue这个安全检查在生产环境必须加否则恶意 zip 可以覆盖系统文件。5.4 我自己的习惯我现在处理任何 zip 相关需求第一件事不是写解压逻辑而是先跑检测脚本看编码。这个习惯帮我省了无数次返工。另外如果是自己打包对外交付一律用 UTF-8 加 bit 11并且在文档里注明“文件名编码 UTF-8”。跨平台交付的坑能提前避就提前避。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

拒绝重复造轮子!我的去水印API已开放,小程序内可购套餐,附Python调用示例

拒绝重复造轮子!我的去水印API已开放,小程序内可购套餐,附Python调用示例

最近很多兄弟问,做短视频二创时去水印功能怎么接。与其到处找不稳定的小接口,不如直接用我维护的这套去水印API。 目前接口已稳定运行,支持抖音、快手、小红书等主流平台,支持视频、图集、实况多种类型。 和网上那些免费接口的区别…

2026/10/15 1:10:52 阅读更多 →
C++浮点数精度揭秘:float与double有效数字的底层原理与工程实践

C++浮点数精度揭秘:float与double有效数字的底层原理与工程实践

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

2026/10/15 1:10:52 阅读更多 →
STM32 HTTP远程升级实战:内存管理、Flash分区与断点续传

STM32 HTTP远程升级实战:内存管理、Flash分区与断点续传

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

2026/10/15 1:10:52 阅读更多 →

最新新闻

成立三个月,Axiom-0 凭什么登顶 RoboCasa365?——一张具身“泛化能力“排行榜,和它背后的路线之争

成立三个月,Axiom-0 凭什么登顶 RoboCasa365?——一张具身“泛化能力“排行榜,和它背后的路线之争

最近具身智能圈有一则消息很提气:总部位于合肥的初创公司第四定律机器人(4Axiom Robotics),其自研的具身智能模型 Axiom-0 登上了国际权威具身评测基准 RoboCasa365 Benchmark,进入公开排行榜的头部行列——多家媒体用…

2026/10/15 2:29:22 阅读更多 →
旭日图实战指南:Davinci平台多层占比可视化落地

旭日图实战指南:Davinci平台多层占比可视化落地

1. 项目概述:为什么旭日图成了数据可视化团队的“新刚需”最近在好几个项目复盘会上,我都被问到同一个问题:“那个环形嵌套结构的图表,叫什么?能不能直接用?”——说的就是旭日图(Sunburst Char…

2026/10/15 2:29:22 阅读更多 →
Meta开源Zurp工具包:用AI代理+Burp Suite破解自家系统,漏洞赏金测试进入人机协作时代

Meta开源Zurp工具包:用AI代理+Burp Suite破解自家系统,漏洞赏金测试进入人机协作时代

当全球顶级科技公司主动把自家系统的大门钥匙递给黑客,事情就变得有趣了。Meta最近做了一件看似疯狂的事:它开源了一个名为Zurp的工具包,专门帮助安全研究人员更高效地“攻击”Facebook、Instagram等自家产品。只不过,这场攻击完全…

2026/10/15 2:29:22 阅读更多 →
Siddhi事件流处理:轻量级CEP引擎实战指南

Siddhi事件流处理:轻量级CEP引擎实战指南

1. Siddhi 是什么?它解决的不是“流计算”这个名词,而是你每天被淹没的数据洪流Siddhi 这个名字第一次出现在我面前时,是在某次处理物联网设备告警风暴的深夜。当时我们部署了上百台边缘传感器,每秒产生近两万条原始事件——温度、…

2026/10/15 2:29:22 阅读更多 →
手机影像参数背后的真相与选购指南

手机影像参数背后的真相与选购指南

1. 为什么手机厂商的影像参数越来越夸张?最近两年,手机厂商在影像参数上的军备竞赛愈演愈烈。"超清四摄"、"亿级像素"、"1英寸大底"等宣传语层出不穷,但很多消费者发现,实际拍照效果并没有参数看起…

2026/10/15 2:29:22 阅读更多 →
Americhem在中国苏州启用全新洁净配混设施

Americhem在中国苏州启用全新洁净配混设施

全球定制聚合物解决方案领导者Americhem于9月28日举行了其位于苏州的全新洁净配混设施启用仪式。此项投资进一步提升了Americhem服务中国、亚太地区以及在该区域开展生产制造业务的全球客户的能力。 该设施专为满足严苛医疗器械应用所需的ISO 13485和cGMP要求而设计&#xff0c…

2026/10/15 2:28:21 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →