根据Spolsky的说法,我不能称自己为开发人员,所以这个问题背后有很多耻辱......
场景:从 C# 应用程序中,我想从 SQL 数据库中获取字符串值并将其用作目录的名称。我有一个安全 (SSL) FTP 服务器,我想在其上使用数据库中的字符串值设置当前目录。
问题:一切正常,直到我用“特殊”字符点击字符串值 - 我似乎无法正确编码目录名称以满足 FTP 服务器。
下面的代码示例
- 以“特殊”字符 é 为例
- 使用 WinSCP 作为 ftps 通信的外部应用程序
- 没有显示设置进程“_winscp”所需的所有代码。
- 通过写入进程标准输入向 WinSCP exe 发送命令
- 为简单起见,不从数据库中获取信息,而是简单地声明一个字符串(但我确实做了一个 .Equals 来确认来自数据库的值与声明的字符串相同)
- 尝试使用不同的字符串编码在 FTP 服务器上设置当前目录 3 次 - 均失败
- 尝试使用从手工制作的字节数组创建的字符串来设置目录 - 这有效
Process _winscp = new Process();
byte[] buffer;
string nameFromString = "Sinéad O'Connor";
_winscp.StandardInput.WriteLine("cd \"" + nameFromString + "\"");
buffer = Encoding.UTF8.GetBytes(nameFromString);
_winscp.StandardInput.WriteLine("cd \"" + Encoding.UTF8.GetString(buffer) + "\"");
buffer = Encoding.ASCII.GetBytes(nameFromString);
_winscp.StandardInput.WriteLine("cd \"" + Encoding.ASCII.GetString(buffer) + "\"");
byte[] nameFromBytes = new byte[] { 83, 105, 110, 130, 97, 100, 32, 79, 39, 67, 111, 110, 110, 111, 114 };
_winscp.StandardInput.WriteLine("cd \"" + Encoding.Default.GetString(nameFromBytes) + "\"");
UTF8 编码将 é 更改为 101(十进制),但 FTP 服务器不喜欢它。
ASCII 编码将 é 更改为 63(十进制),但 FTP 服务器不喜欢它。
当我将 é 表示为值 130(十进制)时,FTP 服务器很高兴,除了我找不到可以为我执行此操作的方法(我必须手动从显式字节构造字符串)。
任何人都知道我应该对我的字符串做些什么来将 é 编码为 130 并使 FTP 服务器满意,并最终通过解释开发人员应该理解的唯一一件事将我提升为 1 级开发人员?