StreamReader 와 파일 의 난 장 판 문 제 를 해결 하 는 방법

많은 사람들 이 파일 을 읽 을 때 어 지 러 운 상황 에 부 딪 힐 것 이 라 고 믿 습 니 다.어 지 러 운 코드 란 어 지 러 운 인 코딩 이라는 뜻 입 니 다.어 지 러 운 코드 는 인 코딩 이 일치 하지 않 아서 생 긴 것 입 니 다.
데모 프로그램:
새 3 개의 텍스트 파일:
clip_image002
인 코딩 은 이름과 마찬가지 로 각각 ansi,Unicode,utf 8 입 니 다.
안의 내용 은 모두:
~!@#¥%……&*()
abcdefg
123456789
테스트 데이터
clip_image004
clip_image006
clip_image008
 
이 파일 들 을 읽 는 코드 는 다음 과 같 습 니 다.
public static void Main()
{
    List lstFilePath = new List()
    {
        "H:\\TestText\\ansi.txt",
        "H:\\TestText\\unicode.txt",
        "H:\\TestText\\utf8.txt"
    };
    foreach (string filePath in lstFilePath)
    {
        using (StreamReader reader = new StreamReader(filePath))
        {
            Console.WriteLine("파일 읽 기"+filePath);
            Console.WriteLine(reader.ReadToEnd());
            Console.WriteLine("************************************************************");
        }
    }
}
출력 입력:
clip_image010
 
첫 번 째 파일 은 ansi 인 코딩 을 사 용 했 지만 StreamReader 의 기본 구조 함 수 는 utf 8 인 코딩 을 사 용 했 기 때문에 인 코딩 이 엉망 이 되 었 습 니 다.
StreamReader 는 특정한 인 코딩 으로 문 자 를 입력 하 는 데 목적 을 두 고 있 으 며,Stream 류 는 바이트 의 입력 과 출력 에 사용 된다.표준 텍스트 파일 의 줄 정 보 를 StreamReader 로 읽 습 니 다.
별도로 지정 되 지 않 는 한 StreamReader 의 기본 인 코딩 은 현재 시스템 의 ANSI 코드 페이지 가 아 닌 UTF-8 입 니 다.UTF-8 은 유 니 코드 문 자 를 정확하게 처리 하고 운영 체제 의 현지 화 버 전에 서 일치 하 는 결 과 를 제공 할 수 있다.
따라서 위의 인 코딩 문 제 를 해결 하 는 해결 방안 은 StreamReader 를 사용 하고 Encoding.Default 를 인 코딩 으로 전달 하 는 것 입 니 다.보통 중국어 운영 체제 에서 Encoding.Default 는 Gb 2312 인 코딩 입 니 다.
public static void Main()
{
    List lstFilePath = new List()
    {
        "H:\\TestText\\ansi.txt",
        "H:\\TestText\\unicode.txt",
        "H:\\TestText\\utf8.txt"
    };
    foreach (string filePath in lstFilePath)
    {
        using (StreamReader reader = new StreamReader(filePath,Encoding.Default))
        {
            Console.WriteLine("파일 읽 기"+filePath);
            Console.WriteLine(reader.ReadToEnd());
            Console.WriteLine("************************************************************");
        }
    }
}
출력 은 다음 과 같 습 니 다:
clip_image012
여기 서 결론 을 얻 었 습 니 다.StreamReader 를 사용 하고 Encoding.Default 를 인 코딩 으로 사용 합 니 다.
안 타 깝 게 도 위의 이 결론 은 어떤 상황 에서 페이지 에 문제 가 존재 할 수 있 습 니 다.예 를 들 어 운영 체제 에서 Encoding.Default 가 Encoding.UTF 8 일 때 입 니 다.
가장 완벽 한 해결 방안 은 파일 이 어떤 인 코딩 으로 저장 되 었 는 지,어떤 인 코딩 으로 읽 는 것 이다.
그러면 어떻게 파일 의 인 코딩 을 얻 습 니까?
다음 코드 를 사용 하면 됩 니 다.

public static Encoding GetEncoding(string filePath)
        {
            if (filePath == null)
            {
                throw new ArgumentNullException("filePath");
            }
            Encoding encoding1 = Encoding.Default;
            if (File.Exists(filePath))
            {
                try
                {
                    using (FileStream stream1 = new FileStream(filePath, FileMode.Open, FileAccess.Read))
                    {
                        if (stream1.Length > 0)
                        {
                            using (StreamReader reader1 = new StreamReader(stream1, true))
                            {
                                char[] chArray1 = new char[1];
                                reader1.Read(chArray1, 0, 1);
                                encoding1 = reader1.CurrentEncoding;
                                reader1.BaseStream.Position = 0;
                                if (encoding1 == Encoding.UTF8)
                                {
                                    byte[] buffer1 = encoding1.GetPreamble();
                                    if (stream1.Length >= buffer1.Length)
                                    {
                                        byte[] buffer2 = new byte[buffer1.Length];
                                        stream1.Read(buffer2, 0, buffer2.Length);
                                        for (int num1 = 0; num1 < buffer2.Length; num1++)
                                        {
                                            if (buffer2[num1] != buffer1[num1])
                                            {
                                                encoding1 = Encoding.Default;
                                                break;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        encoding1 = Encoding.Default;
                                    }
                                }
                            }
                        }
                    }
                }
                catch (Exception exception1)
                {
                    throw;
                }
                if (encoding1 == null)
                {
                    encoding1 = Encoding.UTF8;
                }
            }
            return encoding1;
        }
이 코드 는 encoding 1.GetPreamble()방법 으로 인 코딩 된 바이트 시퀀스 를 얻 은 다음 데 이 터 를 다시 읽 고 데 이 터 를 비교 합 니 다.다 르 면 Encoding.Default 입 니 다.
아니면 Encoding.Utf 8.
GetEncoding(filename)방법 이 있 으 면 위의 읽 기 코드 를 다음 과 같이 수정 할 수 있 습 니 다.
public static void Main()
{
    List lstFilePath = new List()
    {
        "H:\\TestText\\ansi.txt",
        "H:\\TestText\\unicode.txt",
        "H:\\TestText\\utf8.txt"
    };
    foreach (string filePath in lstFilePath)
    {
        using (StreamReader reader = new StreamReader(filePath, GetEncoding(filePath)))
        {
            Console.WriteLine("파일 읽 기"+filePath);
            Console.WriteLine(reader.ReadToEnd());
            Console.WriteLine("현재 인 코딩:"+reader.CurrentEncoding.EncodingName);
            Console.WriteLine("************************************************************");
        }
    }
}
출력 은 다음 과 같 습 니 다:
clip_image002
여기 서 ansi 인 코딩 을 볼 수 있 습 니 다.Encoding.Default 는 간 체 중국어(GB 2312)입 니 다.

좋은 웹페이지 즐겨찾기