文件编码:这适用于C#的WriteByte方法吗?

时间:2012-06-18 14:19:36

标签: c# visual-studio-2010 encoding

我是编码主题的新手,想要更详细地理解它。我在MSDN上找到了创建文件夹和文件的示例。使用WriteByte方法完成文件的创建。 http://msdn.microsoft.com/en-us/library/as2f1fez.aspx

为方便起见,我已将代码直接放在下面:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CreateFolderFile
{
    class Program
    {
        static void Main(string[] args)
        {
            // Specify a "currently active folder"
            string activeDir = @"c:\testdir2";

            //Create a new subfolder under the current active folder
            string newPath = System.IO.Path.Combine(activeDir, "mySubDir");

            // Create the subfolder
            System.IO.Directory.CreateDirectory(newPath);

            // Create a new file name. This example generates
            // a random string.
            string newFileName = System.IO.Path.GetRandomFileName();

            // Combine the new file name with the path
            newPath = System.IO.Path.Combine(newPath, newFileName);

            // Create the file and write to it.
            // DANGER: System.IO.File.Create will overwrite the file
            // if it already exists. This can occur even with
            // random file names.
            if (!System.IO.File.Exists(newPath))
            {
                using (System.IO.FileStream fs = System.IO.File.Create(newPath))
                {
                    for (byte i = 0; i < 100; i++)
                    {
                        fs.WriteByte(i);
                    }
                }
            }

            // Read data back from the file to prove
            // that the previous code worked.
            try
            {

                byte[] readBuffer = System.IO.File.ReadAllBytes(newPath);
                foreach (byte b in readBuffer)
                {
                    Console.WriteLine(b);
                }
            }
            catch (System.IO.IOException e)
            {
                Console.WriteLine(e.Message);
            }



            // Keep the console window open in debug mode.
            System.Console.WriteLine("Press any key to exit.");
            System.Console.ReadKey();
        }
    }
}

我还在Joel Spolsky上发现了一篇关于这个主题的有趣文章:

绝对最低限度每个软件开发人员绝对必须知道Unicode和字符集(没有借口!) http://www.joelonsoftware.com/printerFriendly/articles/Unicode.html

我的问题:WriteByte方法使用什么编码?从我所做的阅读中,无论你使用什么,是否真的可以准确地确定文件的编码? (例如:您发送的csv文件并使用Notepad ++确定编码)。

思想?

2 个答案:

答案 0 :(得分:1)

Stream.WriteByte将字节作为输入(方法的参数)和输出(目标流)处理,它们本质上是二进制数据 - 所以编码的概念(a文本和二进制信息之间的映射)并不适用。

现在,如果您要读取使用WriteByte调用创建的文件,就好像它是一个文本文件,需要您解释< / em>它以特定的编码方式。这是另一回事 - 文件的内容仍然只是字节。

正如Guffa的回答所指出的,文件没有(通常,无论如何 1 )都有任何编码概念。它只是一桶字节。如果您的文件只是纯文本,您必须要么在阅读时知道编码是什么,要么用启发式推断它。


1 文件系统当然可以保留有关编码的元数据 - 但是由创建程序来设置它。

答案 1 :(得分:1)

WriteByte方法根本不使用任何编码。字节值完全按照指定写入,没有转换。

编码仅用于文本。通常,整个文本文件使用相同的编码,但是可以使用包含二进制数据和编码文本的文件。

文件本身没有任何关于任何编码的信息。该文件只包含字节,编码可用于将字节解释为文本。

某些文件格式在文件开头有一个指示符来确定编码。通常,您将使用中性编码(例如ASCII)读取文件的第一部分,以获取有关要使用的编码的信息。 (这是一个引导问题。)

例如,XML文件的第一行可能包含版本标记,该标记可能包含指定编码的属性。另一个例子是Unicode文本文件中的第一个字符,它可以是BOM(字节顺序标记),可用于确定使用哪种类型的unicode编码。