You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Indy+SSL时文件无法打开,文件名乱码导致找不到文件

Indy SSL加载证书时文件名乱码导致EFOpenError的解决办法

问题根源

你遇到的乱码问题核心是错误地将PAnsiChar直接强制转换为PWideChar:

  • OpenSSL API传递的argc参数是UTF-8编码的单字节字符串(PAnsiChar类型)
  • Delphi Unicode版本中,String是UTF-16编码的双字节字符串,直接把单字节指针转双字节指针,会将两个连续的UTF-8字节当作一个Unicode字符解析,最终生成乱码文件名,触发文件找不到的异常。

修复代码

将错误的类型转换替换为UTF-8到Unicode的正确解码,推荐使用Indy自带的工具函数(避免依赖Delphi版本差异):

X509_FILETYPE_PEM:
  begin
    // 替换原有的强制类型转换,正确解码UTF-8字符串为Unicode
    LFileName := IdGlobal.UTF8ToString(argc);
    LOk := Ord(Indy_unicode_X509_load_cert_crl_file(ctx, LFileName, X509_FILETYPE_PEM) <> 0);
  end;

如果使用的是Delphi 2009及以上版本,也可以用原生编码类实现:

X509_FILETYPE_PEM:
  begin
    var UTF8Bytes := TBytes.Create;
    SetLength(UTF8Bytes, StrLen(argc));
    Move(argc^, UTF8Bytes[0], Length(UTF8Bytes));
    LFileName := TEncoding.UTF8.GetString(UTF8Bytes);
    LOk := Ord(Indy_unicode_X509_load_cert_crl_file(ctx, LFileName, X509_FILETYPE_PEM) <> 0);
  end;

额外说明

  • 这段代码里的注释虽然提到了OpenSSL使用ASCII/UTF8,但实际实现时错误地跳过了解码步骤,直接做了类型强制转换,这是Indy旧版本可能存在的bug。
  • 如果条件允许,建议升级到最新稳定版的Indy,官方可能已经修复了这类编码问题。

内容的提问来源于stack exchange,提问作者Tav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:15:47