Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要帮助将C#字符串从一种字符编码转换为另一种字符编码?_C#_Character Encoding_Ftps - Fatal编程技术网

我需要帮助将C#字符串从一种字符编码转换为另一种字符编码?

我需要帮助将C#字符串从一种字符编码转换为另一种字符编码?,c#,character-encoding,ftps,C#,Character Encoding,Ftps,据我所知,我不能称自己为开发人员,所以在这个问题背后有很多羞愧 场景:从C#应用程序中,我想从SQL db中获取一个字符串值,并将其用作目录名。我有一个安全(SSL)FTP服务器,我想在其上使用数据库中的字符串值设置当前目录。 问题:在我输入一个带有“特殊”字符的字符串值之前,一切都正常工作-我似乎无法正确编码目录名以满足FTP服务器的要求 下面的代码示例 以“特殊”字符为例 将WinSCP用作ftps通信的外部应用程序 未显示设置进程“\u winscp”所需的所有代码 通过写入进程stan

据我所知,我不能称自己为开发人员,所以在这个问题背后有很多羞愧

场景:从C#应用程序中,我想从SQL db中获取一个字符串值,并将其用作目录名。我有一个安全(SSL)FTP服务器,我想在其上使用数据库中的字符串值设置当前目录。
问题:在我输入一个带有“特殊”字符的字符串值之前,一切都正常工作-我似乎无法正确编码目录名以满足FTP服务器的要求

下面的代码示例

  • 以“特殊”字符为例
  • 将WinSCP用作ftps通信的外部应用程序
  • 未显示设置进程“\u winscp”所需的所有代码
  • 通过写入进程standardinput向WinSCP exe发送命令
  • 为简单起见,它不从DB获取信息,而是简单地声明一个字符串(但我做了一个.Equals来确认DB中的值与声明的字符串相同)
  • 尝试三次使用不同的字符串编码在FTP服务器上设置当前目录,但均失败
  • 尝试使用从手工制作的字节数组创建的字符串设置目录,该字符串有效
UTF8编码更改为101(十进制),但FTP服务器不喜欢它

ASCII编码改为63(十进制),但FTP服务器不喜欢它

当我将é表示为值130(十进制)时,FTP服务器很高兴,只是我找不到一个方法来为我实现这一点(我必须手动从显式字节构造字符串)


有人知道我应该如何处理我的字符串,将é编码为130,让FTP服务器满意,并通过解释开发人员应该理解的唯一一件事,最终将我提升为一级开发人员吗?

我认为这里的问题是所有.NET字符串都是Unicode。NET字符串中没有“我是什么编码”。因此,使用
Encoding.ASCII.GetString(buffer)
将ASCII中的“字符串”转换回Unicode

我认为您的问题应该通过更改Process.StandardInput的编码来解决,这样您就可以在WinSCP中获得正确的编码

您应该检查什么是
编码。默认值是,因为我很确定它不是UTF8或ASCII。

130不是ASCII(ASCII只有7位--请参阅文档--因此它将“é”转换为正常值“”,因为它没有更好的功能)。UTF-8实际上将字符编码为两个字节(十进制:195和169),但保留代码点

显式地使用代码页,例如--needs来匹配任何其他方面。如下所示,输出中没有“130”,因此。。。不是您需要的编码:-),但同样适用:对特定代码页使用编码

编辑:正如Hans Passant在评论中解释的那样,此处使用的代码页将产生所需的结果

// LINQPad -- Encoding is System.Text.Encoding
var enc = Encoding.GetEncoding(1252);
string.Join(" ", enc.GetBytes("Sinéad O'Connor")).Dump();
// -> 83 105 110 233 97 100 32 79 39 67 111 110 110 111 114
请参阅:了解更多信息

快乐编码


顺便说一句,艺术家们的选择很好——如果是有意的话:p

winscp进程是问题的一部分,它是一个控制台模式的应用程序,在代码页437中运行,即旧的IBM PC编码。其中130实际上是é的字符代码。StandardInput流通常会自动处理翻译,但您的代码非常奇怪。它不能像代码段中给出的那样工作,必须先启动该过程。失去winscp,请使用System.Net及其对FTP的支持。感谢您提供的信息。我意识到代码片段不能正常工作(我删掉了所有流程初始化代码)。我想使用一些本机的.net FTP支持,但它能支持SSL上的FTP(即ftps)吗?只是为了让未来的开发人员更加完善-我接受了Hans的建议,查看了本机.net FTP库,它们可以处理FTP-因此我很快切换了代码,现在不再依赖外部WinSCP应用程序,编码似乎没有问题-它可以正常工作。非常高兴没有外部应用程序,代码更简单,性能更好。谢谢。我确实找到了一种设置流程的方法。StandardInput编码,我只尝试了UTF8,但似乎没有任何帮助(在家里,现在没有代码,将在周一发布)。我不太担心默认编码,因为这只是一种将字节数组版本转换为字符串以进行测试的方法。@pst:我不是说字符串根本没有任何编码。我的意思是你不能选择什么编码字符串。它总是UTF-16@Handleman:好吧,现在你可以看到这个“默认”编码不是UTF-8或ASCII,而是你的区域设置编码。谢谢pst,谢谢Hans。对于那些感兴趣的人,我的代码现在看起来像:string name fromstring=“Sinéad O'Connor”;byte[]buffer=Encoding.GetEncoding(437).GetBytes(nameFromString)_winscp.StandardInput.WriteLine(“cd\”“+Encoding.Default.GetString(buffer)+”\”);
// LINQPad -- Encoding is System.Text.Encoding
var enc = Encoding.GetEncoding(1252);
string.Join(" ", enc.GetBytes("Sinéad O'Connor")).Dump();
// -> 83 105 110 233 97 100 32 79 39 67 111 110 110 111 114