首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PowerShell上传文件到FTP,文件名为GB2312,而不是UTF-8。

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

Stack Overflow用户
提问于 2017-07-14 18:37:37
回答 1查看 420关注 0票数 2

我正在尝试编写一个测试脚本来将文件上传到FTP。我的系统是Windows7。当我使用Windows资源管理器观看FTP时,所有的中文都是错误的字符。使用Firefox查看GBK编码的所有文件的名称是否正确。现在我想上传GBK编码名称的文件,这样Firefox就可以看到所有的名称了。这是我的尝试:

代码语言:javascript
复制
$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编码,都可以用火狐来观看。我猜FTP服务器认为我的文件名编码仍然是UTF-8。所以它错误地解码了。如果我上传时使用的是UTF8编码的名称,那么当我在UTF8中设置火狐编码时,至少FTP文件名是正确的。有没有办法让FTP服务器解码正确?我应该设置FtpWebRequest.Headers还是其他?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-14 19:00:04

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

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

如果服务器的响应是肯定的,FtpWebRequest将使用UTF-8。如果不是,FtpWebRequest将使用本地Windows旧版字符集。

所以您所能做的就是将本地遗留字符集设置为GB2312 (936?)。假设服务器对OPTS utf8 on的响应是否定的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45100878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档