C#在txt文件的开头写入一个ZERO WIDTH NO-BREAK SPACE

时间:2011-08-10 19:03:56

标签: c# java character-encoding

我有一个使用ascii编码用C#编写的文本文件,当我尝试使用java项目读取文件时,我在文件的开头有一个ZERO WIDTH NO-BREAK SPACE字符。有没有人遇到过这种情况?

private static void SavePrivateKey(object key)
{
    if (logger.IsInfoEnabled) logger.Info("SavePrivateKey - Begin");
    string privatekey = (string)key;
    string strDirName = Utility.RCTaskDirectory;
    string strFileName = "PrivateKey.PPK";
    string strKeyPathandName = Path.Combine(strDirName, strFileName);

    //if (File.Exists(strKeyPathandName))
    //{
    //    File.Create(strKeyPathandName);
    //}

    if (!string.IsNullOrEmpty(privatekey))
    {//Save private key file
        if (!Directory.Exists(strDirName))
            Directory.CreateDirectory(strDirName);

        FileStream fileStream = new FileStream(strKeyPathandName, FileMode.OpenOrCreate);
        //TODO: Save File as ASCII
        using (StreamWriter sw = new StreamWriter(fileStream, Encoding.ASCII))
        {

            if (logger.IsDebugEnabled) logger.DebugFormat("Saving the private key to {0}.", strKeyPathandName);
            sw.Write(privatekey);

            sw.Close();
            if (logger.IsDebugEnabled) logger.DebugFormat("Saved private key to {0}.", strKeyPathandName);
        }
    }
    if (logger.IsInfoEnabled) logger.Info("SavePrivateKey() - End");
}

4 个答案:

答案 0 :(得分:4)

看起来文本是用BOM编写的,通常在编写Unicode文件时完成...这个特定字符是UTF16文件的BOM,因此C#中必须有一些东西将此文件写为UTF16 ..

请参阅http://de.wikipedia.org/wiki/Byte_Order_Mark

答案 1 :(得分:2)

正如其他人所说,几乎可以肯定是Unicode Byte Order Mark。如果您查看文件中的实际字节(而不是字符),您可以判断使用哪种编码来编写文件:

UTF-8     -> EF BB BF
UTF-16 BE -> FE FF
UTF-16 LE -> FF FE

答案 2 :(得分:1)

是的,这很正常,请参阅Wikipedia。它是一个可选字符,你应该处理它。因此,很可能您没有正确地将文件写为ASCII,因为只有在文件被编码为unicode时才会出现BOM。

答案 3 :(得分:0)

这是一个Byte Order Mark,表示它是一个UTF-16编码的文本文件。

显然它不是用真正的ASCII编写文件,可能你的代码只是复制字节,事件虽然它们在ASCII范围之外。你可以发布你的代码吗?