使用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
相关产品推荐
相关产品推荐

