OpenSSL C++生成含中文DN的证书请求CSR完整指南
1. 为什么要让DN支持中文场景与核心难点只要公司注册名里带中文做证书请求CSR就注定绕不开中文DN这个坎。用OpenSSL的命令行一把梭虽然简单但到了C工程化集成的场景比如你要在服务端程序里自动生成证书请求、对接CA的API提交材料就必须在代码层面把中文DN正确编码进PKCS#10结构里。这个需求最常见于企业OV/EV证书申请、内部PKI体系的身份证书、代码签名证书等场景而标题里说的带中文的DN生成证书请求本质上不是OpenSSL不支持中文而是你选的字符串编码类型不对导致签出来的CSR要么乱码要么被CA系统直接拒收。我见过不少开发者在第一步就翻车用X509_NAME_add_entry_by_txt往DN里塞中文结果用openssl req -text一看O字段变成了一串æµè¥¿ç之类的乱码或者ASN.1解析出来是BMPSTRING类型CA后台无法正确识别。这背后牵涉到X.509证书里ASN.1 DER编码的字符串类型选择属于典型的看起来不难、做起来全是细节的活。这篇文章就把整个链路拆开讲清楚从原理到完整可编译的C代码再到验证方法和踩坑记录一次说透。1.1 哪些场景必须用中文DN先明确一下什么场景会真的需要中文DN不然容易为了技术而技术。第一类是企业SSL证书申请尤其国内公司的OV/EV证书。CA机构要求组织名称O字段必须和营业执照上的中文名称完全一致部门OU也经常是中文比如研发部财务中心。这种情况下DN里不可能全是ASCII字符。第二类是内部PKI体系比如公司自建的证书签发平台给员工签发客户端认证证书CN字段直接填员工中文姓名O填公司中文名这样证书在客户端展示时一眼能认出归属。第三类是代码签名证书和文档签名证书申请者对外的身份信息通常也是中文名称签发出来的证书里包含中文DN。第四类是自动化签发链路很多人以为命令行手工生成就够了但一旦证书请求变成平台功能需要从数据库里动态取出中文公司名去拼DN命令行脚本就顶不住了必须在C代码里完成。1.2 难点本质ASN.1里的字符串类型DN是一系列属性值的集合每个值在ASN.1 DER编码里必须选定一种字符串类型。X.509里常见的有PrintableString、TeletexString、UniversalString、BMPString和UTF8String。PrintableString只允许ASCII可见字符能覆盖大部分英文DN但中文根本不在它的字符集里。UTF8String是RFC 5280明确要求支持的类型也是现代CA系统最推荐的非ASCII承载类型。OpenSSL在通过API添加DN条目时默认行为倾向于用PrintableString去编码纯ASCII值遇到中文这种多字节字符如果你不显式指定类型它要么报错要么按字节硬解析成其他类型结果就是乱码。所以要解决带中文的DN生成证书请求核心就一句话对每个可能含中文的DN字段显式指定UTF8String编码。之后所有代码都在围绕这个原则展开。2. 动手前必须搞清楚的三件事2.1 X509_NAME里DN到底怎么存的在OpenSSL里DN不是简单一个字符串而是X509_NAME对象。这个对象内部维护了一个有序的X509_NAME_ENTRY链表每个entry对应一个属性值对。编码成DER时一个DN是SEQUENCE里面每个属性是一个SET每个SET里再放AttributeTypeAndValue也就是OID和值。我建议你在脑海里建立这个结构X509_NAME→ 多个Entry → 每个Entry有字段OID 字符串类型 字节数据。字符串类型存在Entry里和值本身是绑定的。也就是说同样一个某科技有限公司你可以存成PrintableString会失败、BMPString乱码风险高或UTF8String正确区别全在添加条目时传入的类型参数。添加中文DN最常用的函数是int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type, const unsigned char *bytes, int len, int loc, int set);各参数含义field是DN字段名比如CNOSTtype是字符串编码类型核心参数bytes是字段值注意必须是UTF-8编码的字节序列len传-1表示自动按strlen计算loc传-1表示把新条目追加到末尾set传0表示每个属性单独成一个SET这是最常见的形式。2.2 MBSTRING_* 参数怎么选OpenSSL定义了几组宏来指定字符串编码方式实际开发中你只需要关心三个宏含义适用场景MBSTRING_ASC按ASCII处理纯ASCII字符时编码为PrintableString国家代码C、纯英文的CN、密码学意义上的ASCII字段MBSTRING_UTF8按UTF-8处理编码为UTF8String所有含中文的字段ST、L、O、OU、CN统一用它最稳MBSTRING_BMP按UTF-16处理编码为BMPString基本不用某些老系统才需要建议避开有一种说法是传0让OpenSSL自动判断我不推荐在DN上这么做。自动判断的规则很绕它根据字段NID允许的字符串类型范围来决定纯ASCII时大概率选PrintableString没问题一旦出现中文不同OpenSSL版本的行为不完全一致有的版本会硬转成BMPString导致后续工具链识别异常。与其赌自动判断不如每个字段显式指定。我的习惯是国家代码用MBSTRING_ASC其余ST、L、O、OU、CN全部用MBSTRING_UTF8。顺带提醒RFC 5280规定C这个字段必须是两位字母的ISO国家代码只能用PrintableString不能用中文这一点别踩。2.3 编码环境准备写代码之前先确认编译环境的字符编码策略这一步能省掉后面一半的乱码问题。中文DN的值在内存里必须是UTF-8字节序列。如果你在Linux上用GCC源文件保存成UTF-8字符串字面量就是UTF-8没问题。Windows上则有两个坑第一MSVC默认按本地代码页解析源文件简体中文系统上通常是GBK你要么把源文件存成带BOM的UTF-8要么在编译选项里加/utf-8让编译器把源文件按UTF-8解析、把执行字符集也设为UTF-8。第二C17里可以用u8广东省这种UTF-8字面量它能保证字符串常量在编译后是UTF-8字节序列不依赖编译器的执行字符集设置。注意C20里u8字面量类型变成char8_t传给OpenSSL接口需要reinterpret_cast一下比较啰嗦老项目建议直接用const char*配合/utf-8。3. C完整实现从裸密钥到标准CSR3.1 整体流程与函数分工生成一个合法的PKCS#10证书请求链路很清晰一共五步生成密钥对。我优先用EVP_PKEY_CTX这套高层API它兼容OpenSSL 1.1.x和3.x不像老的RSA_generate_key_ex在3.0里被标记为废弃。创建X509_REQ对象把版本设为0对应PKCS#10 v1。构造X509_NAME逐个添加DN条目中文字段用MBSTRING_UTF8。把公钥挂到请求对象上用私钥对请求签名。签名算法用SHA-256别再用SHA-1。把CSR和私钥分别写成PEM文件或者直接输出到内存。顺序上有个硬性要求必须先X509_REQ_set_pubkey再X509_REQ_sign因为签名是对包含公钥的请求内容做的公钥没设置就签名出来的CSR在验证时直接失败。3.2 完整源码下面是一份我在实际项目里精简过的可用代码直接复制就能编译运行#include openssl/evp.h #include openssl/x509.h #include openssl/pem.h #include openssl/err.h #include iostream #include string static bool build_subject(X509_REQ* req) { X509_NAME* name X509_NAME_new(); if (!name) return false; const char* country CN; const char* province 广东省; const char* city 深圳市; const char* org 某科技有限公司; const char* ou 研发一部; const char* cn www.example.org.cn; auto add_entry [](const char* field, const char* value) - bool { if (!X509_NAME_add_entry_by_txt(name, field, MBSTRING_UTF8, (const unsigned char*)value, -1, -1, 0)) { std::cerr add field field failed std::endl; return false; } return true; }; // 国家代码是两位ASCII字母按PrintableString编码符合RFC 5280 if (!X509_NAME_add_entry_by_txt(name, C, MBSTRING_ASC, (const unsigned char*)country, -1, -1, 0)) { return false; } if (!add_entry(ST, province)) return false; if (!add_entry(L, city)) return false; if (!add_entry(O, org)) return false; if (!add_entry(OU, ou)) return false; if (!add_entry(CN, cn)) return false; if (!X509_REQ_set_subject_name(req, name)) { X509_NAME_free(name); return false; } X509_NAME_free(name); return true; } static EVP_PKEY* generate_rsa_key(int bits) { EVP_PKEY_CTX* ctx EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, nullptr); if (!ctx) return nullptr; if (EVP_PKEY_keygen_init(ctx) 0) { EVP_PKEY_CTX_free(ctx); return nullptr; } if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) 0) { EVP_PKEY_CTX_free(ctx); return nullptr; } EVP_PKEY* pkey nullptr; if (EVP_PKEY_keygen(ctx, pkey) 0) { EVP_PKEY_CTX_free(ctx); return nullptr; } EVP_PKEY_CTX_free(ctx); return pkey; } int main() { EVP_PKEY* pkey generate_rsa_key(2048); if (!pkey) { ERR_print_errors_fp(stderr); return 1; } X509_REQ* req X509_REQ_new(); if (!req) { EVP_PKEY_free(pkey); ERR_print_errors_fp(stderr); return 1; } X509_REQ_set_version(req, 0); if (!build_subject(req)) { ERR_print_errors_fp(stderr); EVP_PKEY_free(pkey); X509_REQ_free(req); return 1; } if (X509_REQ_set_pubkey(req, pkey) ! 1) { ERR_print_errors_fp(stderr); EVP_PKEY_free(pkey); X509_REQ_free(req); return 1; } if (X509_REQ_sign(req, pkey, EVP_sha256()) 0) { ERR_print_errors_fp(stderr); EVP_PKEY_free(pkey); X509_REQ_free(req); return 1; } BIO* bio BIO_new_file(server.csr, wb); if (!bio || PEM_write_bio_X509_REQ(bio, req) ! 1) { std::cerr write csr failed std::endl; ERR_print_errors_fp(stderr); return 1; } BIO_free(bio); BIO* key_bio BIO_new_file(server.key, wb); if (!key_bio || PEM_write_bio_PrivateKey(key_bio, pkey, nullptr, nullptr, 0, nullptr, nullptr) ! 1) { std::cerr write key failed std::endl; ERR_print_errors_fp(stderr); return 1; } BIO_free(key_bio); std::cout CSR generated: server.csr / server.key std::endl; EVP_PKEY_free(pkey); X509_REQ_free(req); return 0; }几个容易忽略的细节说一下。X509_NAME_add_entry_by_txt的type传MBSTRING_UTF8后OpenSSL会把输入字节当作UTF-8数据校验然后以UTF8String类型存进Entry。C字段单独用MBSTRING_ASC让它正确生成PrintableString。这里我没有把C也放进lambda就是为了区别处理。PEM_write_bio_PrivateKey在不指定加密算法时对RSA私钥输出的是-----BEGIN PRIVATE KEY-----这种PKCS#8格式比-----BEGIN RSA PRIVATE KEY-----的PKCS#1传统格式通用性好一些大部分CA系统和运维工具都认。错误处理这里全部打了ERR_print_errors_fp(stderr)调试时非常有用它能打出OpenSSL内部的错误队列很多生成失败的真相都在这里。3.3 编译、运行与命令行验证Linux上用GCC编译假设OpenSSL开发库已装好g -stdc17 -O2 -o gen_csr gen_csr.cpp -lssl -lcrypto ./gen_csrWindows上在Visual Studio里除了链接libssl.lib和libcrypto.lib务必给C/C命令行加上/utf-8否则源文件里的中文常量可能在编译期就被转成错误的字节序列程序运行后生成的CSR依然是乱码这个坑我帮你们先踩过了。跑完会生成server.csr和server.key两个文件。第一步验证签名和内容openssl req -in server.csr -noout -text -verify重点看三处verify OK表示CSR自签名有效Subject:这一行的中文是否正常显示Signature Algorithm是否为sha256WithRSAEncryption。正常输出大致是verify OK Certificate Request: Data: Version: 1 (0x0) Subject: C CN, ST 广东省, L 深圳市, O 某科技有限公司, OU 研发一部, CN www.example.org.cn Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Signature Algorithm: sha256WithRSAEncryption第二步用asn1parse看底层编码类型这一步最能说明问题openssl asn1parse -in server.csr -i输出里能看到DN部分每个属性15:d4 hl2 l 1 prim: PRINTABLESTRING :CN 20:d4 hl2 l 16 prim: UTF8STRING :广东省 40:d4 hl2 l 14 prim: UTF8STRING :深圳市 58:d4 hl2 l 29 prim: UTF8STRING :某科技有限公司只要中文的字段明确写着UTF8STRING就说明编码方向对了。如果你看到BMPSTRING或者一串十六进制乱码回到代码里检查是不是没用MBSTRING_UTF8。4. 常见问题与排查实录4.1 问题速查表现象可能原因解决方案生成的CSR里中文乱码源文件不是UTF-8或编译器执行字符集不对加/utf-8用u8字面量确认值确实是UTF-8字节asn1parse看到BMPSTRING添加DN时type参数没传MBSTRING_UTF8显式指定MBSTRING_UTF8openssl req -verify不通过set_pubkey和sign顺序颠倒或密钥与请求不匹配先set_pubkey再sign确保用同一把私钥CA系统拒收CSR编码类型非UTF8String或C字段非法检查asn1parse输出C字段只用两位ASCII签名算法显示SHA-1用了EVP_sha1()改用EVP_sha256()Windows控制台输出乱码终端代码页是GBK无法显示UTF-8控制台执行chcp 65001再查看编译报错说RSA系列函数废弃OpenSSL 3.0废弃了低层RSA API改用EVP_PKEY_CTX生成密钥4.2 乱码的三种来源与定位方法中文乱码是最常见的故障而且来源往往不只一处。我总结过三个独立环节任何一个出问题都会乱码。第一环是源文件编码。源码里写的广东省最终必须编译成UTF-8字节。Linux默认没问题Windows上如果你没做任何处理MSVC可能把字符串按GBK编译程序生成CSR时OpenSSL以为这是UTF-8校验UTF-8合法性很可能直接失败或产生错误序列。解决办法就是给编译器加/utf-8或者用u8字面量。第二环是OpenSSL添加DN时的类型参数。如果type传错比如传入MBSTRING_ASCOpenSSL会把UTF-8字节按单字节字符处理编码结果必然乱。这一环的问题是逻辑层面的错就算源文件编码正确也会乱。第三环是展示终端。Windows控制台默认GBK代码页即使CSR文件里是正确的UTF-8你用openssl req -text输出到控制台也可能显示乱码。这只影响显示不影响文件内容。定位方法很简单重定向到文件再用支持UTF-8的编辑器打开或者先执行chcp 65001。4.3 编码类型错误与CA拒收比乱码更隐蔽的是类型对但值不被CA认可。比如你用MBSTRING_BMP把某科技有限公司编码成BMPString从OpenSSL自己的解析看可能是正常的但某些CA后台只认UTF8String提交后直接被拒。所以判断编码对不对不能只看openssl req -text显示正常要看asn1parse里的类型标记。另外提一个实际遇到的细节有些CA系统对DN字符串末尾的空格特别敏感尤其是从数据库里读出来的公司名可能带不可见字符建议在拼DN之前统一trim掉首尾空白。中文全角空格和普通空格都清理一遍这个习惯能省不少沟通成本。4.4 旧版API与OpenSSL 3.0的兼容问题网上很多老教程用的是RSA_generate_key_ex、RSA_new、BN_new这一套在OpenSSL 3.0里build时会报deprecated警告如果发行版编译OpenSSL时加了no-deprecated直接编译失败。我推荐用上面代码里的EVP_PKEY_CTX流程它在1.1.x和3.x都稳定工作。还有一点OpenSSL 1.1.0以上版本不需要手动调用OpenSSL_add_all_algorithms()和SSL_library_init()程序初始化时自动完成。如果你还兼容老版本1.0.2保留这两行调用也无妨。判断版本用宏OPENSSL_VERSION_NUMBER但大多数项目直接放弃1.0.2更省心它已经停止维护很多年了。5. 工程化扩展建议5.1 把CSR直接输出到内存字符串很多业务场景不需要落地成文件比如你得把CSR内容POST给CA的接口。用内存BIO就能拿到字符串BIO* mem BIO_new(BIO_s_mem()); if (!mem) return; if (PEM_write_bio_X509_REQ(mem, req) ! 1) { BIO_free(mem); return; } BUF_MEM* buf nullptr; BIO_get_mem_ptr(mem, buf); std::string csr_text(buf-data, buf-length); BIO_free(mem);拿到csr_text后可以直接放进HTTP请求体。记得用BIO_s_mem()而不是BIO_new_file后者是文件型BIO语义完全不同。这个技巧同样适用于私钥、证书的输出。5.2 生成EC密钥的CSR如果你的场景更看重性能或者CA明确要求支持国密之外的椭圆曲线可以把密钥生成部分替换成ECstatic EVP_PKEY* generate_ec_key() { EVP_PKEY_CTX* ctx EVP_PKEY_CTX_new_id(EVP_PKEY_EC, nullptr); if (!ctx) return nullptr; if (EVP_PKEY_keygen_init(ctx) 0) { EVP_PKEY_CTX_free(ctx); return nullptr; } if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, NID_X9_62_prime256v1) 0) { EVP_PKEY_CTX_free(ctx); return nullptr; } if (EVP_PKEY_CTX_set_ec_param_enc(ctx, OPENSSL_EC_NAMED_CURVE) 0) { EVP_PKEY_CTX_free(ctx); return nullptr; } EVP_PKEY* pkey nullptr; if (EVP_PKEY_keygen(ctx, pkey) 0) { EVP_PKEY_CTX_free(ctx); return nullptr; } EVP_PKEY_CTX_free(ctx); return pkey; }生成CSR的后续代码完全不用改X509_REQ_sign(req, pkey, EVP_sha256())会自动选择合适的曲线签名算法。注意OPENSSL_EC_NAMED_CURVE这个参数要带上它决定参数编码是使用命名曲线OID还是显式参数不带的话某些CA系统可能无法解析。5.3 中文CN的个人证书与最后建议如果项目面向的是个人证书或客户端认证证书CN字段直接用中文姓名即可比如CN张三。这种场景下把add_entry(CN, cn)里的cn换成姓名就行编码逻辑没有任何区别。但如果是服务器SSL证书CN还是建议放域名中文CN的服务器证书在浏览器兼容性上一直存在不确定性没必要给自己找麻烦。我个人在实际项目中还有一个习惯生成CSR后不要立刻删除私钥但也不要随便分发。私钥只在持有者本地保存CSR可以随意传输。提交给CA后无论审核结果如何私钥和CSR要一起归档后续做证书续期时可以直接复用同一把私钥只需重新生成CSR提交即可。最后再分享一个容易被忽略的验证技巧拿到CA签发的正式证书后用openssl x509 -in cert.pem -noout -text看一眼Subject里的中文是否和当初申请时一致。如果显示正常说明从生成到签发整条链路都没问题如果这里乱码但CSR本身验证是好的问题出在CA侧需要联系对方确认DN的编码处理策略这已经不是你C代码能控制的范围了。整条链路走通一次之后这类需求基本就是写个封装函数的事核心记住UTF-8 UTF8String这六个字就够了。

相关新闻

密码分析学:从差分特征到S盒安全验证的实战方法论

密码分析学:从差分特征到S盒安全验证的实战方法论

1. 这门课到底在讲什么:从“破译”到“设计”的思维翻转“第五讲 密码分析学”——光看标题,很多人第一反应是:这不就是教人怎么黑进系统、怎么破解别人密码的“黑客速成班”?其实恰恰相反。我带过几届某高校信息安全方向的实践课…

2026/10/17 22:25:25 阅读更多 →
Coppersmith攻击实战:已知p高位比特分解RSA模数

Coppersmith攻击实战:已知p高位比特分解RSA模数

假设你手里有一份泄露出来的日志片段,上面只有几行十六进制字符串,其中一行恰好是某个RSA公钥的模数n,另一行则是p的前半段比特。看起来好像没什么用——毕竟只知道一半,剩下的512位不还是要跑穷举?但如果你懂Coppersm…

2026/10/17 22:25:25 阅读更多 →
有道翻译API接入实战:从签名到批量翻译的完整指南

有道翻译API接入实战:从签名到批量翻译的完整指南

1. 从零上手有道翻译API:一个后端开发者的接入实录翻译能力几乎是现代应用开发的标配需求。无论是做跨境电商的商品描述本地化、做在线教育平台的课件多语言适配,还是做一个简单的浏览器插件帮用户快速看懂外文资料,背后都绕不开一个稳定可靠…

2026/10/17 22:25:25 阅读更多 →

最新新闻

查找算法全解析:从顺序查找到B+树,工程选型与避坑指南

查找算法全解析:从顺序查找到B+树,工程选型与避坑指南

很多人在学数据结构的时候,会把"查找"这一章当成一堆零散算法的集合:顺序查找、折半查找、哈希、二叉排序树……背完ASL公式就扔到一边。但我在实际做开发之后回头看,这一章恰恰是全书最容易和工程经验挂钩的地方——你写的每一条S…

2026/10/17 23:17:11 阅读更多 →
Claude Code(22):用 mcp-builder 构建自定义 MCP Server 的完整配置与验证

Claude Code(22):用 mcp-builder 构建自定义 MCP Server 的完整配置与验证

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

2026/10/17 23:17:11 阅读更多 →
SAP MTO配置核心:物料主数据四字段与特殊库存E的硬性约束

SAP MTO配置核心:物料主数据四字段与特殊库存E的硬性约束

简介:本资源是一份面向SAP顾问、制造企业计划与生产管理人员的MTO(按订单生产)业务全流程实操指南,聚焦机械、电子等定制化程度高行业的SAP系统落地难点。内容覆盖物料主数据配置(含MRP策略组20与个体/集中需求标识&am…

2026/10/17 23:16:10 阅读更多 →
R-AUC与T-AUC一文读懂:Qwen3.5-4B-singprobe流式安全指标与幻觉检测原理

R-AUC与T-AUC一文读懂:Qwen3.5-4B-singprobe流式安全指标与幻觉检测原理

【免费下载链接】Qwen3.5-4B-singprobe 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/Qwen3.5-4B-singprobe 点击查看 免费下载 Qwen3.5-4B-singprobe 是一个构建在 Qwen/Qwen3.5-4B 之上的流式安全护栏(streaming guardrail)探…

2026/10/17 23:16:10 阅读更多 →
从工具调用到具身执行:AI-Agent如何驱动机械臂完成物理任务

从工具调用到具身执行:AI-Agent如何驱动机械臂完成物理任务

上周在实验室里盯着一台六轴机械臂反复尝试把一颗M3螺丝插进工件孔里,旁边屏幕上的Agent日志一行行刷着“抓取失败、重试”“角度偏移0.8度、补偿”。那一刻我突然意识到,AI-Agent这一脚跨得比很多人想象的要大——短短两年前,我们还在为Agen…

2026/10/17 23:15:09 阅读更多 →
C语言qsort深度解析:从函数原型到比较函数避坑指南

C语言qsort深度解析:从函数原型到比较函数避坑指南

简介:这份PDF资料聚焦C语言标准库中qsort函数的实际用法,面向正在学习C语言、需要掌握通用排序技巧的初学者与进阶开发者,帮助解决不同数据类型排序时比较函数如何编写的问题。资源包共1个PDF文件,大小约32KB,内容以代…

2026/10/17 23:15:09 阅读更多 →

日新闻

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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →