使用 PowerShell 上传文件到 FTP,文件名是 GB2312,不是 UTF-8

Using PowerShell upload files to FTP, with file name in GB2312, not UTF-8

我正在尝试编写一个测试脚本来将文件上传到 FTP。我的系统是Windows 7. 我用Windows资源管理器看FTP时,中文全是错的。用Firefox看,GBK编码,所有文件名都是正确的。现在我想上传GBK编码名称的文件,所以Firefox会正确地看到所有名称。这是我的尝试:

$coder1= [system.Text.encoding]::GetEncoding('GB2312')
$coder2 = [system.Text.encoding]::UTF8

$user = "test"
$password = "test"
$ftp = 'ftp://10.10.10.253/shzx/'
$souce = '新建文本文档.txt'
$loacalfile = Get-Item w:\test\新建文本文档.txt
$souce1 = [system.Web.HttpUtility]::UrlEncode($souce,$coder1)
$encodeA = $ftp+$souce

$request = [system.Net.FtpWebRequest]::Create($encodeA)
$request = [system.Net.FtpWebRequest]$request
$request.Method=[system.Net.WebRequestMethods+FTP]::uploadfile
$request.Credentials = New-Object system.Net.NetworkCredential($user,$password)
$request.UseBinary = $true
$request.UsePassive = $true

$dest = $request.GetRequestStream()
$src = [system.IO.File]::OpenRead($loacalfile)
$buffsize = [system.Math]::Min($src.length , 4096)
$buff = New-Object system.Byte[] $buffsize

$numbuffloaded = 0
$byteread = 0

do
{
   $byteread = $src.read($buff,0,$buffsize)
   $dest.write($buff,0,$buffsize)
   $numbuffloaded ++
}
while($byteread -ne 0)

$dest.close()
$src.close()

$response = $request.GetResponse()

而且我上传测试文件后,名称不正确。无论UTF8编码还是GBK编码,用Firefox都可以观看。我猜 FTP 服务器认为我的文件名编码仍然是 UTF-8。所以它解码错误。如果我使用 UTF8 编码的名称上传,当我将 Firefox 编码设置为 UTF8 时,至少 FTP 文件名是正确的。 有没有办法让 FTP 服务器解码正确?我应该设置 FtpWebRequest.Headers 还是其他?

您不能选择与 FtpWebRequest 一起使用的编码。

FtpWebRequest 在启动连接时向服务器发送 OPTS utf8 on 命令。

如果服务器响应积极,FtpWebRequest 将使用 UTF-8。否则,FtpWebRequest 将使用本地 Windows 旧字符集。

因此,您可以将本地旧字符集设置为 GB2312936?)。假设服务器对 OPTS utf8 on.

做出否定响应