C# Ftp使用utf-8字符(如希腊语、德语等)创建文件名

C# Ftp使用utf-8字符(如希腊语、德语等)创建文件名,c#,encoding,utf-8,ftp,C#,Encoding,Utf 8,Ftp,我正在尝试使用以下代码创建一个ftp服务器文件(我还尝试使用UseBaryan选项true和false) 问题是我的ftp服务器上的文件没有名称 我请求包含英文、希腊文和德文字符-->“Δοκιμασττκόαρχείοüß-Copy.txt 1)我能用它做什么? 一旦我将非Unicode程序的区域设置-->当前语言更改为希腊语,就会有一些改进,但我仍然怀念德语字符 2)为什么c#程序依赖于此设置?为了避免依赖于此设置,我是否应该遵循一种特殊的方法? 编码噩梦再次出现:(在代码更改中: stri

我正在尝试使用以下代码创建一个ftp服务器文件(我还尝试使用UseBaryan选项true和false)

问题是我的ftp服务器上的文件没有名称 我请求包含英文、希腊文和德文字符-->“Δοκιμασττκόαρχείοüß-Copy.txt

1)我能用它做什么?

一旦我将非Unicode程序的区域设置-->当前语言更改为希腊语,就会有一些改进,但我仍然怀念德语字符

2)为什么c#程序依赖于此设置?为了避免依赖于此设置,我是否应该遵循一种特殊的方法?

编码噩梦再次出现:(

在代码更改中:

string localFile = @"C:\test\δοκιμαστικό αρχείο - Copy.txt";
String ftpname = "ftp://ftp.myhost.gr/public_html/test" + @"/" + Uri.EscapeUriString(Program.remoteFileName);

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpname);
致:

这需要完成,因为的输入参数是根据RFC2396规范转义的

该标准规定:

当一个新的URI方案定义了一个表示文本数据的组件时 由通用字符集[UCS]中的字符组成 数据首先应根据UTF-8编码为八位字节 字符编码[STD63];然后只有那些没有 对应于未保留集合中的字符应为 编码百分比

因此,上面显示的代码更改将强制以UTF-8格式输入此字符串

关于:

2) 为什么c#程序依赖于此设置?是否有特殊设置 为了避免依赖性,我应该遵循的方法 背景


Uri.EscapeUriString需要遵循RFC 2396规范的输入,因此需要以它能够理解的格式传递数据。

仅将字符串编码为UTF8并将其作为文件名发送到FTP服务器是不够的。过去所有FTP服务器都只理解ASCII,现在则需要保持向后兼容性-即使他们知道Unicode——当他们开始时,他们也会将所有文件名视为ASCII

让你(你的计划)一切顺利必须首先检查服务器的功能。服务器在客户端连接后发送其功能-在您的情况下,您必须检查FEAT UTF8。如果您的服务器发送该功能,则表示它理解UTF8。然而,即使它理解,您也必须明确告诉它,从现在起,您将发送文件名UTF8编码现在它是您的程序缺少的东西(正如您所说的,您的服务器支持utf8)

您的客户端必须向FTP服务器发送以下内容选择UTF8 ON。发送后,您可以使用UTF8或对服务器说UTF8 ish(可以这么说)


请阅读此处了解详细信息

“问题是我的ftp服务器上的文件没有我请求的名称”ftp协议支持Unicode吗?您的服务器软件呢?我想不支持。但因为我可以从cpanel和最有趣的是从filezilla(使用强制utf-8选项)执行此操作那么我想我应该可以通过C#…你使用的FTP服务器软件是什么?我不拥有服务器。我只知道它是Linux操作系统。你是否尝试更改编码,如[1][1]:这不起作用,但感谢您的回答。我将进一步搜索它。请向上投票,但不确定它是否是解决方案。我假设Program.remoteFileName和remoteFileName是相同的?是的,remoteFileName与Program是完全相同的对象。remoteFileName我已更新了我的答案。我只是部分地逃避了问题字符串传递到WebRequest.Create。我已更新了答案,以确保传递到WebRequest.Create的整个字符串都被转义。
string localFile = @"C:\test\δοκιμαστικό αρχείο - Copy.txt";
String ftpname = "ftp://ftp.myhost.gr/public_html/test" + @"/" + Uri.EscapeUriString(Program.remoteFileName);

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpname);
string remoteFileName = "δοκιμαστικό αρχείο - Copy.txt";
String ftpname = "ftp://ftp.myhost.gr/public_html/test" + @"/" + remoteFileName;

var escapedUriString = Uri.EscapeUriString(Encoding.UTF8.GetString(Encoding.ASCII.GetBytes(ftpname)));
var request = (FtpWebRequest)WebRequest.Create(escapedUriString);