StreamReader 와 파일 의 난 장 판 문 제 를 해결 하 는 방법
8587 단어 StreamReader파일 디 코딩
데모 프로그램:
새 3 개의 텍스트 파일:
인 코딩 은 이름과 마찬가지 로 각각 ansi,Unicode,utf 8 입 니 다.
안의 내용 은 모두:
~!@#¥%……&*()
abcdefg
123456789
테스트 데이터
이 파일 들 을 읽 는 코드 는 다음 과 같 습 니 다.
public static void Main()
{
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("************************************************************");
}
}
}
출력 입력:
첫 번 째 파일 은 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
{
"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("************************************************************");
}
}
}
출력 은 다음 과 같 습 니 다:
여기 서 결론 을 얻 었 습 니 다.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
{
"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("************************************************************");
}
}
}
출력 은 다음 과 같 습 니 다:
여기 서 ansi 인 코딩 을 볼 수 있 습 니 다.Encoding.Default 는 간 체 중국어(GB 2312)입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
StreamReader 와 파일 의 난 장 판 문 제 를 해결 하 는 방법첫 번 째 파일 은 ansi 인 코딩 을 사 용 했 지만 StreamReader 의 기본 구조 함 수 는 utf 8 인 코딩 을 사 용 했 기 때문에 인 코딩 이 엉망 이 되 었 습 니 다. StreamReader ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.