Python base64 编码中的 b‘xxx‘ 到底是什么:str 与 bytes 边界全解析
1. 从一行bxxx说起这个前缀到底在提示什么很多人第一次在 Python 里调用base64.b64encode()看到输出是baGVsbG8这样的形式第一反应是我要的字符串怎么多了个 b 和一对引号。更让人困惑的是把这个结果直接写进 JSON、塞进 URL、拼进 SQL或者丢给前端渲染往往就出问题了——要么报类型错误要么显示成一堆乱码要么图片加载不出来。这个bxxx不是 bug也不是 Python 在故意为难你。它是 Python 3 里bytes 类型的字面量表示。理解它等于理解了 Python 3 字符串体系里最关键的一条分界线文本str和字节bytes是两种东西不能混着用。base64 编码的输入和输出本质上都是字节序列而不是文本。这一点如果没吃透后面所有的编码解码、图片内联、数据传输都会反复踩坑。这篇内容面向的是已经会写一点 Python、但在处理编码、文件、网络数据时经常被b...卡住的开发者。我会把 base64 的字节本质、b...的来龙去脉、编码解码的完整链路、图片 base64 内联的实操、以及一堆真实会遇到的报错和排查方法讲清楚。看完之后你应该能一眼判断这里该用 str 还是 bytes并且能独立写出稳定可靠的编解码代码。先说结论方便你带着答案读下去bxxx是 bytes 对象base64 编解码全程在 bytes 层面工作需要文本时用.decode()转成 str需要字节时用.encode()转成 bytes两者之间的转换必须显式声明字符集通常是 UTF-8。2. 核心概念拆解str、bytes 与 base64 的三方关系2.1 为什么 Python 3 要把文本和字节分开Python 2 时代str其实就是字节串unicode才是真正的文本。这种设计导致中文、emoji 在跨平台时经常出现看起来一样、实际不一样的问题。Python 3 痛下决心做了切割str表示 Unicode 文本是人类可读的字符序列比如你好、hello。bytes表示原始字节序列是计算机存储和传输的 0/1 分组比如b\xe4\xbd\xa0\xe5\xa5\xbd。两者之间不能隐式转换。你写hello bworld会直接抛TypeError。这个设计初看麻烦但它逼着开发者明确我现在处理的是文本还是字节从根源上消灭了一大批乱码问题。base64 的定位很特殊它把任意二进制数据转换成只包含 64 个可打印 ASCII 字符的文本形式。注意虽然结果看起来像文本但在 Python 里b64encode返回的仍然是 bytes因为它的本质是用 ASCII 字节表示二进制。这就是b...出现的直接原因。2.2 base64 到底做了什么从 3 字节到 4 字符base64 的核心逻辑可以用一句话概括每 3 个字节24 位重新切成 4 组每组 6 位映射到 64 个字符表上。64 个字符是A-Z26 个、a-z26 个、0-910 个、和/2 个一共 64 个。另外用作填充符。举个例子字符串Man的 ASCII 字节是M 77 01001101 a 97 01100001 n 110 01101110拼起来 24 位010011 010110 000101 101110按 6 位分组后查表010011 19 →T010110 22 →W000101 5 →F101110 46 →u所以Man编码结果是TWFu。这就是 base64 的全过程。如果原始数据长度不是 3 的倍数就用补齐。比如Ma只有 2 字节编码成TWEM只有 1 字节编码成TQ。填充符的作用是让解码方知道原始长度避免歧义。注意base64 不是加密它只是编码。任何人都能一键还原。把敏感信息用 base64 藏起来等于没藏。这一点在安全场景里必须清楚。2.3b...里的内容为什么常常是乱码当你对一个中文文本做 base64 编码再打印结果看到的是b5L2g5aW9这种正常的 ASCII 字符。但如果你直接打印一个 bytes 对象而它里面包含非 ASCII 字节Python 会用\x转义显示比如b\xe4\xbd\xa0\xe5\xa5\xbd。很多人误以为这是乱码其实它只是 bytes 的显示方式。\xe4表示一个十六进制字节 0xE4。三个字节\xe4\xbd\xa0合起来才是 UTF-8 编码的你字。所以看到b\x...不要慌先想清楚这个 bytes 是用什么字符集编码的如果是 UTF-8.decode(utf-8)就能还原成正常文本。3. 编码解码全流程从 str 到 base64 再回来3.1 标准三步走encode → b64encode → decode处理文本 base64 的标准流程是三步缺一不可import base64 text 你好世界 # 第一步str 转 bytes指定字符集 raw_bytes text.encode(utf-8) # 第二步bytes 做 base64 编码结果仍是 bytes b64_bytes base64.b64encode(raw_bytes) # 第三步bytes 转 str方便传输或存储 b64_str b64_bytes.decode(ascii) print(b64_str) # 5L2g5aW977yM5LiW55WM反过来解码b64_str 5L2g5aW977yM5LiW55WM # 第一步str 转 bytes b64_bytes b64_str.encode(ascii) # 第二步base64 解码得到原始 bytes raw_bytes base64.b64decode(b64_bytes) # 第三步bytes 转 str text raw_bytes.decode(utf-8) print(text) # 你好世界这里每一步的字符集选择都有讲究。encode(utf-8)是因为原始文本是中文UTF-8 是通用选择。decode(ascii)是因为 base64 结果只含 ASCII 字符用 ascii 解码最严格也最安全。如果你用decode(utf-8)也能work但语义上不如 ascii 精确。3.2 为什么 b64encode 不直接返回 str这是新手最常问的问题。原因有三第一base64 的输入是二进制。图片、压缩包、加密后的密文这些都不是文本没有字符集概念。如果b64encode返回 strPython 就必须替这些二进制数据猜一个字符集这违背了 Python 3 显式优于隐式的原则。第二保持类型一致性。编码前是 bytes编码后还是 bytes中间不引入额外的类型转换逻辑更干净。第三避免二次编码歧义。如果返回 str开发者可能直接对它做.encode()导致 base64 结果被再次编码产生难以排查的错误。所以b...不是累赘而是一种类型契约我处理的是字节你要文本请自己转。3.3 常见字符集选择对照场景编码字符集解码字符集说明中文文本utf-8utf-8最通用兼容性最好纯英文文本ascii 或 utf-8ascii 或 utf-8两者等价base64 结果asciiasciibase64 只含 ASCII 字符二进制文件无需编码无需解码直接对 bytes 操作旧系统数据gbkgbk需与数据源一致实操心得如果你不确定原始数据用什么字符集优先试 utf-8。utf-8 解码失败时再考虑 gbk、latin-1 等。latin-1 的特点是任何字节都能解码成功所以它常被用作兜底但代价是可能得到错误结果。4. 图片 base64 内联实操data URI 的完整玩法4.1 data URI 的结构拆解热搜词里出现了data:image/png;base64,ivborw0kggo...这样的字符串这是data URI格式用于把图片直接内联到 HTML 或 CSS 里省去一次 HTTP 请求。它的结构是data:[MIME类型];base64,[base64编码的数据]拆开看data:是协议头固定写法。image/png是 MIME 类型告诉浏览器这是什么格式。;base64声明后面是 base64 编码。逗号后面是实际的 base64 字符串。一个完整的例子import base64 with open(logo.png, rb) as f: img_bytes f.read() b64_str base64.b64encode(img_bytes).decode(ascii) data_uri fdata:image/png;base64,{b64_str} # 写进 HTML html fimg src{data_uri} altlogo注意open用的是rb模式读出来直接是 bytes不需要 encode。这是二进制文件和文本文件处理的关键区别。4.2 图片转 base64 的完整脚本下面是一个可以直接抄的脚本支持常见图片格式自动识别 MIME 类型import base64 import mimetypes from pathlib import Path def image_to_data_uri(file_path): path Path(file_path) mime_type, _ mimetypes.guess_type(str(path)) if mime_type is None: raise ValueError(f无法识别文件类型: {file_path}) with open(path, rb) as f: raw f.read() b64 base64.b64encode(raw).decode(ascii) return fdata:{mime_type};base64,{b64} uri image_to_data_uri(avatar.jpg) print(uri[:80] ...)mimetypes.guess_type会根据扩展名推断 MIME 类型省去手动判断。这个函数在标准库里不需要额外安装。4.3 体积膨胀与性能权衡base64 编码会让数据体积膨胀约33%。因为每 3 字节变成 4 字符比例是 4/3 ≈ 1.333。这意味着一张 100KB 的图片base64 后约 133KB。一张 1MB 的图片base64 后约 1.33MB。热搜词里提到the size of this image (109420 bytes) exceeds the maximum这类报错通常出现在某些平台对 data URI 长度有限制时。109420 字节约 107KB膨胀后约 143KB如果平台限制是 100KB就会超限。所以 data URI 适合的场景是小图标、小 logo几 KB 到几十 KB需要减少 HTTP 请求数量的场景邮件 HTML 内联图片不适合的场景是大图、高清图需要浏览器缓存的资源大量图片批量内联实操心得我一般把 10KB 作为分界线。小于 10KB 的图标用 data URI大于 10KB 的走独立文件加缓存。这样既减少了请求数又不会让 HTML 文件膨胀得离谱。4.4 从 data URI 还原图片反向操作也很常用比如从网页抓到的 data URI 还原成图片文件import base64 import re def data_uri_to_file(data_uri, output_path): # 匹配 data:image/png;base64,xxxxx match re.match(rdata:(?Pmime[\w/]);base64,(?Pdata.), data_uri) if not match: raise ValueError(不是合法的 data URI) mime match.group(mime) b64_data match.group(data) raw base64.b64decode(b64_data) with open(output_path, wb) as f: f.write(raw) return mime这里用正则提取 MIME 和 base64 部分然后b64decode还原成 bytes用wb模式写入文件。注意写入二进制文件必须用wb用w会报错。5. 高频报错与排查技巧实录5.1TypeError: a bytes-like object is required这是最常见的报错完整信息通常是TypeError: a bytes-like object is required, not str原因你把 str 直接传给了b64encode或b64decode。错误写法base64.b64encode(hello) # 报错正确写法base64.b64encode(hello.encode(utf-8))排查思路看到这个报错先检查传给 base64 函数的参数是不是 str。如果是加.encode()。5.2binascii.Error: Invalid base64-encoded string完整报错可能是binascii.Error: Invalid base64-encoded string: number of data characters (5) cannot be 1 more than a multiple of 4或者binascii.Error: Non-base64 digit found原因通常有三类第一字符串长度不对。base64 的长度必须是 4 的倍数含填充符。如果长度是 5、9、13 这种就会报错。第二包含了非法字符。base64 只允许A-Za-z0-9/如果字符串里有空格、换行、中文就会报错。第三URL 安全的 base64 混用。URL 安全版本用-和_替代和/如果拿 URL 安全的结果去标准解码器解就会失败。排查方法import base64 def safe_b64decode(s): # 去掉空白字符 s s.strip().replace(\n, ).replace(\r, ).replace( , ) # 补齐填充 padding 4 - len(s) % 4 if padding ! 4: s * padding # 处理 URL 安全字符 s s.replace(-, ).replace(_, /) return base64.b64decode(s)这个函数把常见的脏数据都处理了实测能解决大部分解码失败问题。5.3 中文乱码解码后得到\xe4\xbd\xa0如果你解码 base64 后得到的是b\xe4\xbd\xa0...这种形式说明你拿到的是 bytes还没转成 str。解决raw base64.b64decode(b64_str) text raw.decode(utf-8)如果.decode(utf-8)报UnicodeDecodeError说明原始数据不是 UTF-8 编码。这时候要试其他字符集for charset in [utf-8, gbk, gb2312, latin-1]: try: text raw.decode(charset) print(f用 {charset} 解码成功: {text[:50]}) break except UnicodeDecodeError: continuelatin-1几乎不会失败因为它把每个字节都映射到一个字符但结果可能不是你想要的。所以它只适合做最后兜底不适合作为首选。5.4 常见问题速查表报错信息根本原因解决方法a bytes-like object is required传了 str 给 base64 函数加.encode()Invalid base64-encoded string长度不对或含非法字符清洗字符串、补齐填充Non-base64 digit found含空格、换行、中文去掉非 base64 字符UnicodeDecodeError字符集不匹配试 utf-8、gbk、latin-1Incorrect padding缺少填充补齐到 4 的倍数图片显示不出来data URI 格式错误检查 MIME 和逗号体积超限base64 膨胀 33%压缩图片或改用文件5.5 一个容易被忽略的坑换行符有些系统生成的 base64 字符串会每 76 个字符插入一个换行符这是 MIME 规范的要求。Python 的b64encode默认不换行但email模块或某些第三方库生成的会换行。如果你从外部拿到一个带换行的 base64 字符串直接解码会失败。解决方法是先去掉所有换行b64_str b64_str.replace(\n, ).replace(\r, )或者用base64.b64decode(b64_str, validateFalse)但更推荐显式清洗因为validateFalse会忽略非法字符可能掩盖真正的问题。6. 进阶技巧与工程实践6.1 URL 安全 base64为什么需要它标准 base64 包含和/这两个字符在 URL 里有特殊含义表示空格/是路径分隔符。所以把标准 base64 直接放进 URL 会出问题。解决方案是URL 安全 base64用-替代用_替代/import base64 data b\xfb\xff\xbf standard base64.b64encode(data) urlsafe base64.urlsafe_b64encode(data) print(standard) # b/// print(urlsafe) # b-___解码时对应使用urlsafe_b64decode。如果混用就会报Invalid base64-encoded string。实操心得JWTJSON Web Token用的就是 URL 安全 base64而且去掉了填充符。如果你手动解析 JWT记得先补齐填充再解码。6.2 大文件流式编解码对于大文件一次性读入内存再编码会导致内存暴涨。可以用流式方式分块处理import base64 def encode_file_stream(input_path, output_path, chunk_size3 * 1024): # chunk_size 必须是 3 的倍数避免填充问题 with open(input_path, rb) as fin, open(output_path, wb) as fout: while True: chunk fin.read(chunk_size) if not chunk: break fout.write(base64.b64encode(chunk))注意chunk_size要选 3 的倍数这样每个块都能独立编码不会在块边界产生填充符。如果选其他值块之间会出现导致拼接后的结果无法正确解码。6.3 base64 与哈希、加密的区别这三个概念经常被混淆这里明确一下base64编码可逆不提供任何安全性目的是把二进制变成文本。哈希如 SHA-256单向不可逆用于校验完整性不能用来还原数据。加密如 AES可逆但需要密钥用于保护机密性。实际工程中三者经常组合使用。比如先用 AES 加密数据再对密文做 base64 编码最后传输。这样既保证了机密性又保证了传输安全。6.4 性能对比base64 vs 十六进制除了 base64另一种常见的二进制转文本方式是十六进制hex。两者对比维度base64hex体积膨胀33%100%可读性较差较好编解码速度较快快字符集64 个16 个典型用途图片内联、JWT哈希值、调试hex 的体积膨胀是 100%因为每个字节变成两个字符。base64 只膨胀 33%所以在传输效率上更优。但 hex 更易读调试时更方便。Python 里 hex 转换data b\x01\x02\x03 print(data.hex()) # 010203 print(bytes.fromhex(010203)) # b\x01\x02\x036.5 在 JSON 里传输二进制数据JSON 不支持二进制所以传输图片、文件时标准做法是先 base64 编码成字符串再放进 JSONimport base64 import json with open(photo.jpg, rb) as f: img_bytes f.read() payload { filename: photo.jpg, content: base64.b64encode(img_bytes).decode(ascii) } json_str json.dumps(payload)接收方payload json.loads(json_str) img_bytes base64.b64decode(payload[content]) with open(received.jpg, wb) as f: f.write(img_bytes)这个模式在 REST API 里非常常见。注意decode(ascii)这一步不能省否则json.dumps会因为 bytes 不可序列化而报错。7. 我踩过的坑和几条实用建议第一个坑是字符集不一致。我曾经把一个用 GBK 编码的中文文本做 base64接收方用 UTF-8 解码结果全是乱码。排查了半天才发现是字符集问题。教训是base64 本身不关心字符集但原始数据的字符集必须双方约定一致。如果无法约定就在编码前统一转成 UTF-8。第二个坑是填充符丢失。有些系统在传输 base64 时会去掉末尾的导致解码失败。解决方法是解码前自动补齐def pad_base64(s): return s * (-len(s) % 4)-len(s) % 4这个写法很巧妙它能算出需要补几个。比如长度是 5-5 % 4 3补 3 个长度是 4-4 % 4 0不补。第三个坑是把 base64 当加密用。有次看到同事把密码用 base64 编码后存进数据库以为这样就安全了。实际上任何人拿到数据库都能一键还原。base64 只是编码不是加密这个认知必须建立。最后分享一个调试技巧当你拿到一个 base64 字符串不确定对不对时先检查三件事——长度是不是 4 的倍数、有没有非法字符、解码后能不能用 UTF-8 还原成可读文本。这三步能解决 90% 的问题。剩下的 10%大概率是字符集或数据本身损坏需要回到数据源头排查。base64 这个工具本身不复杂复杂的是它背后牵扯的字符集、类型系统、传输协议。把b...理解透把 str 和 bytes 的边界划清楚后面无论处理图片、文件还是网络数据都会顺畅很多。

相关新闻

排列组合入门:从数数思维到组合计数实战指南

排列组合入门:从数数思维到组合计数实战指南

排列组合这个东西,我在带新人的时候发现一个特别有意思的现象:很多人一听到“排列组合”四个字,第一反应就是“这不是高中内容吗”,然后紧接着第二反应就是“但我当年就没学明白”。这两个反应其实一点都不矛盾,因为排…

2026/10/12 1:24:51 阅读更多 →
AD25安装零报错指南:从环境准备到常见故障排查

AD25安装零报错指南:从环境准备到常见故障排查

不少刚接触 PCB 设计的朋友,电脑配置不差,网速也快,结果装个 AD25(Altium Designer 25)愣是被各种报错劝退。有的卡在安装中途闪退,有的装完打不开,有的报缺少系统组件。其实大多数问题都不是软…

2026/10/9 20:18:31 阅读更多 →
AI Agent技术演进:从工具到智能体的下一代技术布局与TaoToken统一Key实践

AI Agent技术演进:从工具到智能体的下一代技术布局与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/12 21:20:03 阅读更多 →

最新新闻

基于三菱PLC的自动配料控制系统设计:双速给料与落差补偿实战

基于三菱PLC的自动配料控制系统设计:双速给料与落差补偿实战

做自动配料控制系统,绕不开两件事:PLC的选型,和配料流程里那些让人头疼的细节——飞料、秤漂、配方切换、粘度变化导致的给料差异。这个“基于三菱PLC的自动配料控制系统的设计”项目,从需求拆解、硬件选型、控制逻辑到现场调试完…

2026/10/13 4:01:58 阅读更多 →
Spark persist优化实战:存储策略选型与血缘锚点设计

Spark persist优化实战:存储策略选型与血缘锚点设计

1. 项目概述:为什么一个 persist 调用能决定 Spark 作业的生死在某次处理日均 8TB 原始日志的用户行为分析任务时,我接手了一个运行了三年的老 Spark SQL 作业。它每天凌晨两点准时启动,但最近两周频繁超时——从原本稳定的 42 分钟一路飙升到…

2026/10/13 4:01:58 阅读更多 →
MATLAB/Simulink ABS建模全流程:从车辆动力学到门限值控制

MATLAB/Simulink ABS建模全流程:从车辆动力学到门限值控制

第一次在Simulink里跑通自己搭的ABS制动防抱死模型时,我盯着轮速曲线看了很久——车轮转速没有直接跌到零,而是像锯齿一样一段段往下收,车速平滑下降,滑移率稳定咬在峰值附着区间附近。那个瞬间我才真正明白,ABS控制的…

2026/10/13 4:01:58 阅读更多 →
树形论坛源码设计与实现:从邻接表到路径枚举的完整方案

树形论坛源码设计与实现:从邻接表到路径枚举的完整方案

简介:这是一套基于树形结构设计的论坛网站程序源码,面向需要搭建独特互动社区的开发者与站长,可在本地或服务器部署后快速构建层级化的话题讨论平台。包内文件总数1712个,压缩包大小约4.42MB,主要包含286个PHP业务脚本…

2026/10/13 4:01:58 阅读更多 →
年会抽奖小程序实践:九宫格与转盘共用服务端抽奖引擎的工程方案

年会抽奖小程序实践:九宫格与转盘共用服务端抽奖引擎的工程方案

简介:面向年会场景的抽奖互动Web小程序,基于JSP实现,无需数据库即可运行,数据以静态方式存储,共包含两个页面:九宫格抽奖和转盘抽奖。其核心规则是先由九宫格抽出一名幸运者免发红包,再通过转盘…

2026/10/13 4:01:58 阅读更多 →
告别Serv-U破解版:企业FTP/SFTP服务器部署与配置实战

告别Serv-U破解版:企业FTP/SFTP服务器部署与配置实战

简介:针对 Serv-U FTP 服务器软件,这是一份破解版程序包,适合希望了解 FTP 服务搭建原理、软件组件构成及配置方式的开发者与网络管理员,可用于隔离环境下的技术研究。压缩包内共 27 个文件,包括 ServUDaemon.exe、Ser…

2026/10/13 4:00:58 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →