2009-06-16 6 views
0

.NET 3.5SP1에서 File.Copy()이라는 이상한 동작이 나타났습니다. 그것이 버그인지 기능인지는 알 수 없습니다. 그러나 그것이 나를 미치게한다는 것을 압니다. 사용자 정의 빌드 단계에서 File.Copy()을 사용하고 문자 인코딩을 엉망으로 만듭니다.File.Copy 및 문자 인코딩

UTF-8 인코딩 된 텍스트 파일을 통해 ASCII 인코딩 텍스트 파일을 복사 할 때 대상 파일은 여전히 ​​UTF-8로 인코딩되지만 새 파일의 내용과 UTF-8에 대한 3 개의 접두사 문자가 추가됩니다. ASCII 문자는 괜찮지 만 ANSI 코드 페이지의 나머지 문자 (128-255)는 올바르지 않습니다.

다음은 재생산 코드입니다. 먼저 UTF-8 파일을 대상에 복사 한 다음 ANSI 파일을 동일한 대상에 복사합니다. Content of copy.txt : this is ASCII encoded:/Encoding: utf-8

File.WriteAllText("ANSI.txt", "this is ANSI encoded: é", Encoding.GetEncoding(0)); 
File.WriteAllText("UTF8.txt", "this is UTF8 encoded: é", Encoding.UTF8); 

File.Copy("UTF8.txt", "copy.txt", true); 

using (StreamReader reader = new StreamReader("copy.txt", true)) 
{ 
    Console.WriteLine("Content of copy.txt : " + reader.ReadToEnd() + "/Encoding: " + 
       reader.CurrentEncoding.BodyName); 
} 

File.Copy("ANSI.txt", "copy.txt", true); 

using (StreamReader reader = new StreamReader("copy.txt", true)) 
{ 
    Console.WriteLine("Content of copy.txt : " + reader.ReadToEnd() + "/Encoding: " + 
       reader.CurrentEncoding.BodyName); 
} 

이런 일이 발생하는 이유 어떤 아이디어 : 두 번째 콘솔 출력의 출력을 주목하라? 내 코드에 실수가 있습니까? 정확한 ANSI/ASCII 혼란

답변

1

작성중인 ASCII.txt이 해결하는 방법에 어떤 아이디어

EDIT (내 현재의 생각은 존재하는 경우 이전 파일을 삭제하는 것입니다)? 첫 번째 줄에 ANSI.txt를 작성하고 있지만 ASCII는 악센트 부호가없는 문자이므로 ASCII가 아닙니다. ANSI 파일에는 ASCII 또는 UTF-8이 아닌 ANSI라는 전제가 포함되어 있지 않습니다.

기본적으로 예제를 작성하여 ASCII와 ANSI의 중간 단계로 바뀌 었습니다.

모든 ASCII 파일이 UTF-8로 "감지"될 것으로 기대하지만 인코딩 검색은 UTF-8이 아닌 다른 것으로 바이트 순서 표시가있는 파일을 사용합니다. 그것은 전체 파일을 읽은 다음 인코딩이 무엇인지 추측하는 것과는 다릅니다. 에서는 StreamReader 용 문서에서

:

이 생성자 UTF8Encoding에 부호화 초기화 스트림 파라미터 및 기본 크기의 내부 버퍼를 사용 BaseStream 속성.

detectEncodingFromByteOrderMarks 파라미터 스트림의 최초의 3 바이트를 찾고 하여 부호화를 검출한다. 자동으로 은 UTF-8, 리틀 엔디안 유니 코드 및 빅 엔디안 유니 코드 텍스트 을 인식하며 해당 파일이 바이트 순서 표시로 시작하면 자동으로 인식합니다. 자세한 내용은 Encoding.GetPreamble 메서드를 참조하십시오.

지금 File.Copy는 이곳 저곳에서 원시 바이트를 복사하는 - 그것은 처음에 텍스트 파일로 해석하려고하지 않기 때문에 그것은 문자 인코딩의 측면에서 아무것도을 변경하지 마십시오 장소.

문제점 (부분적으로 ANSI/ASCII 부분으로 인한)을 어디에서 볼 수 있는지 분명하지 않습니다. 나는 "File? Copy change things?"의 문제를 구분 해줄 것을 제안한다. 및 "StreamReader는 어떤 문자 인코딩을 감지합니까?" 당신의 마음과 질문 모두에서.대답은해야한다 :

  • File.Copy가에있는 파일의 내용을 변경하지 마십시오 모든
  • StreamReader 만 UTF-8과 UTF-16 감지 할 수 있습니다; 다른 인코딩으로 인코딩 된 파일을 읽어야하는 경우에는 명시 적으로 생성자에 명시해야합니다. (개인적으로 방법으로 Encoding.Default 대신 Encoding.GetEncoding(0)을 사용하는 것이 좋습니다 것입니다. 나는 그것이 명확하게 생각합니다.)
+0

문제는 StreamReader가 아닙니다. 문제를 재현 할 수있는 짧은 코드를 만드는 데만 사용했습니다. (그리고 내가 ASCII와 ANSI를 혼동하고 혼란스러워하면서 놀랐다.) 처음에는 16 진수 편집기에서 알아 차렸고 UTF-8 바이트 순서 표시 (시작 부분에 3 바이트)와 악센트 부호가있는 문자의 잘못된 문자 코드가 있기 때문에 결과 파일이 올바르지 않습니다. – chris166

+0

뭔가 이상합니다. 나는 그것을 더 이상 재현 할 수 없다. 그래서 뭔가가 구식이었습니다 (16 진수 편집기, VS 코드 등). 어쨌든, 문제를 조사하고 그것에 많은 시간을 보내 주셔서 감사합니다! – chris166

+0

나의 기쁨 - 정말로 이것이 답변을 타이핑하는 것보다 많은 시간을 들이지는 않았지만. 때때로 다른 질문들이 * 많은 * 노력을 덜어주었습니다 :) –

0

난이 File.Copy와 아무 상관이 의심한다. 당신이보고있는 것은 StreamReader가 기본적으로 UTF-8을 사용하여 디코딩하고, UTF-8이 하위 호환이기 때문에 StreamReader가 ANSI 인코딩 파일을 읽는 데 UTF-8 사용을 중단 할 이유가 없다는 것입니다.

16 진수 편집기에서 ASCII.txt와 copy.txt를 여는 경우 동일합니까?

+0

아니요, StreamReader의 인코딩 감지가 정상적으로 작동합니다. copy.txt는 처음에는 UTF-8 바이트 순서 표시가 있고 움라우트 문자에는 잘못된 문자가 있습니다. – chris166