gpt4 book ai didi

Delphi IdFTP - 获取以指定 ANSI 代码页编码的文件列表

转载 作者:行者123 更新时间:2023-12-03 18:26:40 27 4
gpt4 key购买 nike

IdFTP ,我连接的服务器不是使用UTF-8,而是ANSI。我的代码没有什么特别之处,我只是设置了Host , Username , Password并连接到服务器。然后我调用List没有参数的方法。遍历 DirectoryListing给我文件名的错误结果。我在本地代码页 (CP-1250) 中编码的示例目录名称是:

aąęsśćńółżźz



我想我可以通过将其转换为 AnsiString 来“修复”文件名字段并设置代码页,但它似乎已经损坏 - DirectoryListing[I].FileName 的内存转储:

一种 ? ?年代? ? ? ?? ?? z
6100 FDFF FDFF 7300 FDFF FDFF FDFF 8FDB DFDF 7A00

使用 GIdDefaultAnsiEncoding 进行操作或 IOHandler.DefStringEncoding (在连接之后,列表之前)没有区别。我不想搞砸 IdFTPIdGlobal代码,因为我将它与其他涉及 Unicode 的项目一起使用,并且这些项目完美地工作。德尔福 XE2 或 XE7。

如您所见 FData每个字符字符串包含 2 个字节的原始文件名:

enter image description here

即使我设置 IOHandler.DefStringEncoding任何 TIdTextEncodingFIsSingleByte = True , FMaxCharSize = 1 .但是它看起来很有希望,因为 #$009F 在 CP-1250 中是“ź”,但我不是在寻找每个服务器的临时解决方案。我希望 Indy 在设置 IOHandler.DefStringEncoding 后能够正确处理这个问题和 GIdDefaultAnsiEncoding基于服务器功能(UTF-8 或具有指定编码的 ANSI)。

Total Commander 连接日志:

enter image description here

最佳答案

您的服务器支持 MLSD命令。 Total Commander 正在发送 MLSD命令而不是旧的 LIST命令。这很好,因为 MLSD具有标准化格式(参见 RFC 3659),其中包括对嵌入式字符集信息的支持。如果没有明确说明字符集,则必须使用 UTF-8。
您没有显示 TIdFTP 的命令/响应日志, 但事实上 TIdFTPListItem.Data属性显示MLSD格式化输出数据意味着 TIdFTP.List()也在使用MLSD命令(通过内部调用 TIdFTP.ExtListDir())。显示的输出不包含显式 charset属性,所以 TIdFTP将文件名解码为 UTF-8。
但是,TIdFTPListItem.Data 中显示的原始文件名数据属性不是您显示的目录名称的正确 UTF-8 编码形式(即使存储为原始 8 位编码 UnicodeString - 这是 TIdFTP.ExtListDir() 在解析它之前在内部执行的操作)。所以问题是:

  • 您的 FTP 服务器一开始没有将目录名称从 CP-1250 正确转换为 UTF-8。考虑到 Total Commander 似乎能够正确处理列表,这不太可能。
  • TIdFTP在解析原始 UTF-8 八位字节数据之前未正确存储它。这更有可能。

  • 很难说实际上是哪种情况,因为您没有显示实际传输的原始列表数据。而且您也没有具体说明您使用的是哪个版本的 Delphi 和 Indy。假设服务器正确传输 UTF-8,您可能只是使用了无法正确处理 UTF-8 传输的旧 Indy 版本。 AFAIK,当前可用的版本(撰写本文时为 10.6.2.5270)应该能够处理它,只要您使用的是 Delphi 2009 或更高版本。如果您可以提供原始列表数据的 Wireshark 捕获,我可以检查 TIdFTP 中是否存在任何逻辑问题是否需要修复。

    关于Delphi IdFTP - 获取以指定 ANSI 代码页编码的文件列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29371412/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com