0

我是编码主题的新手,想更详细地了解它。我在 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++ 确定编码)。

想法?

4

2 回答 2

1

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

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

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


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

于 2012-06-18T14:22:42.683 回答
1

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

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

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

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

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

于 2012-06-18T14:26:38.487 回答