【问题标题】:Upload file with BOM encoding上传带有 BOM 编码的文件
【发布时间】:2020-08-14 14:01:35
【问题描述】:

我需要使用UCS-2 LE BOM 编码在 FTP 服务器上上传/创建文件。我正在使用 C#。

基于Microsoft's documentation,我必须将UnicodeEncodingbigEndian:falsebyteOrderMark:true 一起使用。代码如下:

using (WebClient client = new WebClient())
{
    client.Encoding = new UnicodeEncoding(false, true);
    client.Credentials = myCredentials;
    client.UploadString(path, WebRequestMethods.Ftp.UploadFile, myCsvInString);
}

FTP 服务器上创建的文件实际上有UCS-2 Little Endian。出于测试目的,我尝试将byteOrderMark 切换为false,得到了相同的结果。

为什么?我错过了什么?

我知道我可以添加'\uFEFF',但为什么不自动完成?

【问题讨论】:

    标签: c# unicode encoding byte-order-mark


    【解决方案1】:

    UnicodeEncoding的接口和描述在字节序标记的处理上可以改进。 UnicodeEncoding 有一个字节顺序标记 属性,但使用它的唯一方法(除了EqualsGetHashCode)是GetPreamble。所有其他方法,尤其是核心方法GetBytes 都没有。

    这个想法是确保字节顺序标记只写在文件的开头。 UnicodeEncoding 不知道上下文。因此,如果需要,由调用者添加前导码(即字节顺序标记)。

    基于这个概念,WebClient.UploadString 不能假设它正在上传文件。它可能是其他一些 Unicode 内容。所以它不会添加序言。

    您必须自己添加序言。 UnicodeEncoding.GetPreamble 将返回它。

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 1970-01-01
      • 2011-04-04
      • 2014-08-30
      • 2010-10-16
      • 2013-07-15
      • 2017-10-19
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多