尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

libcurl CURLOPT_CONV_FROM_NETWORK_FUNCTION 详解:网络编码到主机编码的字符集转换回调

libcurl CURLOPT_CONV_FROM_NETWORK_FUNCTION 详解:网络编码到主机编码的字符集转换回调 libcurl CURLOPT_CONV_FROM_NETWORK_FUNCTION 详解网络编码到主机编码的字符集转换回调【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl本篇指南围绕 libcurl 的CURLOPT_CONV_FROM_NETWORK_FUNCTION选项展开讲解它在非 ASCII 平台如 EBCDIC 主机上如何通过用户自定义回调将网络传输的 ASCII 命令与数据转换为宿主机本地编码。读完本文你将掌握该回调的完整原型、返回值约定、与 libcurl 内置 iconv 机制的配合关系、代码集宏的覆盖方法以及它在 7.82.0 版本中的弃用状态和替代思路。选项定位解决非 ASCII 平台的网络编码差异绝大多数现代系统使用 ASCII/UTF-8 编码但部分大型主机如 IBM 主机采用 EBCDIC 编码。当 libcurl 运行在这样的平台上时网络上传输的协议命令、响应文本等数据使用网络标准编码通常为 ASCII 系而本机进程需要主机编码二者之间存在转换需求。CURLOPT_CONV_FROM_NETWORK_FUNCTION正是为此设计它注册一个回调函数当 libcurl 从网络收到命令或 ASCII 数据时调用该回调把数据从网络编码就地转换为宿主机编码。该选项的官方定义见 CURLOPT_CONV_FROM_NETWORK_FUNCTION.md适用协议为 All所有协议自 7.15.4 版本加入 libcurl。回调原型与基本用法回调需要匹配如下原型#include curl/curl.h CURLcode conv_callback(char *ptr, size_t length); CURLcode curl_easy_setopt(CURL *handle, CURLOPT_CONV_FROM_NETWORK_FUNCTION, conv_callback);参数语义如下ptr指向待转换数据的缓冲区转换是**就地in-place**完成的——转换后的数据覆盖写入同一块缓冲区而不是新分配一块返回。length需要转换的字节数。返回值约定转换成功必须返回CURLE_OK遇到错误应返回curl.h中定义的 CURLcode 错误码典型如CURLE_CONV_FAILED。官方示例ASCII 到 EBCDIC 的转换原文档给出了一个将缓冲区内 ASCII 数据就地转换为 EBCDIC 的参考实现完整示例代码如下static CURLcode my_conv_from_ascii_to_ebcdic(char *buffer, size_t length) { int rc 0; /* in-place convert buffer from ASCII to EBCDIC */ if(rc 0) { /* success */ return CURLE_OK; } else { return CURLE_CONV_FAILED; } } int main(void) { CURL *curl curl_easy_init(); /* use platform-specific functions for codeset conversions */ curl_easy_setopt(curl, CURLOPT_CONV_FROM_NETWORK_FUNCTION, my_conv_from_ascii_to_ebcdic); }注意示例中的转换逻辑rc 0是占位实现实际项目中应替换为平台提供的字符集转换 API如iconv、系统 EBCDIC 转换例程等。关键在于两点——数据必须在buffer内就地改写并且根据转换结果返回CURLE_OK或CURLE_CONV_FAILED。内置 iconv 机制与代码集宏若将回调指针设为NULL或不设置该选项默认值即为 NULLlibcurl 将使用内置的 iconv 转换函数。这带来两种后果若构建 libcurl 时定义了HAVE_ICONV则内置转换可用若构建时未定义HAVE_ICONV同时也没有注册任何回调则转换直接返回CURLE_CONV_REQD错误码表示需要转换但缺少转换能力。当HAVE_ICONV被定义时还必须定义CURL_ICONV_CODESET_OF_HOST来指明宿主机代码集例如#define CURL_ICONV_CODESET_OF_HOST IBM-1047libcurl 内置 iconv 代码对网络与 UTF-8 代码集名称有默认定义#define CURL_ICONV_CODESET_OF_NETWORK ISO8859-1 #define CURL_ICONV_CODESET_FOR_UTF8 UTF-8如果目标系统的实际代码集与这些默认值不一致必须在使用前覆盖这三个宏定义。三个宏的分工清晰宏默认值用途CURL_ICONV_CODESET_OF_HOST无默认必须自定义宿主机本地代码集如IBM-1047CURL_ICONV_CODESET_OF_NETWORKISO8859-1网络传输使用的代码集CURL_ICONV_CODESET_FOR_UTF8UTF-8UTF-8 转换目标代码集特性位与可用性CURL_VERSION_CONV该选项只对非 ASCII 平台有意义。若 libcurl 在构建时提供了该选项即定义了CURL_DOES_CONVERSIONScurl_version_info(3)返回的特性位中会带有CURL_VERSION_CONV标志。应用可以在运行时通过该特性位探测当前 libcurl 是否具备转换能力再决定是否注册回调。源码中的弃用标记与实现佐证该选项在当前仓库中已被标记为弃用源码层面的证据如下选项枚举声明在 include/curl/curl.h 中该选项使用CURLOPTDEPRECATED宏声明参数类型为CURLOPTTYPE_FUNCTIONPOINT数值编号 142并注明7.82.0, Serves no purpose anymore——即从 7.82.0 起弃用理由为不再有任何用途。同组被弃用的还有CURLOPT_CONV_TO_NETWORK_FUNCTION143 号和CURLOPT_CONV_FROM_UTF8_FUNCTION144 号。选项注册表在 lib/easyoptions.c 中CONV_FROM_NETWORK_FUNCTION被注册为CURLOT_FUNCTION类型说明它以函数指针形式通过curl_easy_setopt传入且不依赖任何其他选项值。枚举一致性测试测试脚本 tests/test745.pl 将CURLOPT_CONV_FROM_NETWORK_FUNCTION纳入枚举完整性校验确保文档、头文件与选项注册表三者保持一致。弃用状态总结原文档明确指出自 7.82.0 起不可用且已弃用仅在构建 libcurl 时定义了CURL_DOES_CONVERSIONS的前提下才会编译进库中。这意味着对现代 libcurl≥ 7.82.0的常规构建该选项基本处于历史遗留状态阅读既有旧代码时若遇到它应理解为 EBCDIC 时代的产物新代码不应再依赖该选项。与同类转换选项的关系该选项并非孤立存在它属于 libcurl 的一组编码转换回调另两个兄弟选项见 CURLOPT_CONV_FROM_UTF8_FUNCTION.md 与 CURLOPT_CONV_TO_NETWORK_FUNCTION.mdCURLOPT_CONV_FROM_NETWORK_FUNCTION把网络编码ASCII 系转换为宿主机编码用于接收网络命令与 ASCII 数据时本文主题CURLOPT_CONV_TO_NETWORK_FUNCTION把宿主机编码转换为网络编码用于发送方向CURLOPT_CONV_FROM_UTF8_FUNCTION把 UTF-8 转换为宿主机编码仅用于 SSL 证书处理场景。三者同样自 7.82.0 起弃用且都依赖CURL_DOES_CONVERSIONS构建宏。返回值curl_easy_setopt(3)返回一个CURLcode表示设置成功与否CURLE_OK0表示一切正常非零值表示出错具体错误含义参见 libcurl-errors。注册回调本身不触发转换实际转换发生在传输过程中收到网络数据时此时回调返回非CURLE_OK会导致相应传输失败。实践建议新代码不要使用该选项自 7.82.0 起弃用新项目应通过平台级 iconv 或自定义传输层处理编码转换旧代码迁移若维护运行在 EBCDIC 平台上的老版本 libcurl 程序可通过curl_version_info(3)的CURL_VERSION_CONV特性位判断库是否支持再决定是否保留回调注册逻辑构建前提确需启用时必须在构建 libcurl 时定义CURL_DOES_CONVERSIONS并正确设置CURL_ICONV_CODESET_OF_HOST等代码集宏回调实现要点务必就地改写ptr指向的缓冲区并按转换结果返回CURLE_OK或CURLE_CONV_FAILED。【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表