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 ファイルで、メモ帳 ++ を使用してエンコードを決定します)。

考え?

4

2 に答える 2

1

このWriteByteメソッドは、エンコーディングをまったく使用しません。バイト値は、変換なしで、指定されたとおりに正確に書き込まれます。

エンコーディングはテキストのみに使用されます。通常、テキスト ファイル全体で同じエンコーディングが使用されますが、バイナリ データとエンコードされたテキストの両方を含むファイルを作成することもできます。

ファイル自体には、エンコーディングに関する情報はありません。ファイルにはバイトのみが含まれており、エンコーディングを使用してバイトをテキストとして解釈することができます。

一部のファイル形式には、ファイルの先頭にエンコードを決定するためのインジケーターがあります。通常、ニュートラル エンコーディング (ASCII など) を使用してファイルの最初の部分を読み取り、使用するエンコーディングに関する情報を取得します。(これは少しブートストラップの問題です。)

たとえば、XML ファイルの最初の行には、エンコーディングを指定する属性を含むバージョン タグが含まれている場合があります。もう 1 つの例は、Unicode テキスト ファイルの最初の文字です。これは、使用された Unicode エンコーディングのタイプを判断するために使用できる BOM (バイト オーダー マーク) である可能性があります。

于 2012-06-18T14:26:38.487 に答える
1

Stream.WriteByte入力 (メソッドへのパラメーター) と出力 (ターゲット ストリーム) の両方としてバイトを処理します。これらは本質的にバイナリデータです。したがって、エンコーディング (テキストとバイナリ情報の間のマッピング) の概念は適用されません。

呼び出しを使用して作成されたファイルを、特定のエンコーディングで解釈する必要があるテキスト ファイルであるかのように読み取るとします。それは別の問題です。ファイルの内容はまだ単なるバイトです。WriteByte

Guffa の回答に記載されているように、ファイルには (通常、とにかく1 ) エンコーディングの概念はありません。それは単なるバイトのバケツです。ファイルが単なるプレーン テキストの場合は、ファイルを読み取るときにエンコーディングが何であるかを知るか、ヒューリスティックで推測する必要があります。


1もちろん、ファイル システムはエンコーディングに関するメタデータを保持できますが、それを設定するのは作成プログラム次第です。

于 2012-06-18T14:22:42.683 に答える