2010-04-07 8 views
15

ISO 88591-1 형식으로 저장된 텍스트 파일에 Latin-1 범위의 악센트 부호가있는 문자가 전송됩니다. 일반 ASCII az 등). ISO 8859-1의 싱글 바이트 액센트 문자가 유효한 UTF-8 문자가되도록 C#을 사용하여이 파일을 UTF-8으로 어떻게 변환합니까?.NET을 사용하여 Latin-1 강조 문자가 포함 된 ISO 8859-1 인코딩 된 텍스트 파일을 UTF-8로 변환하는 방법

나는 ASCIIEncoding으로 위해 StreamReader를 사용하려고하고 인코딩 ascii 및 인코딩 utf8를 인스턴스화하고 Encoding.Convert(ascii, utf8, ascii.GetBytes(asciiString)) —를 사용하지만 악센트 문자가 물음표로 렌더링되는 의해 UTF-8로 ASCII 문자열로 변환했다.

어떤 단계가 빠져 있습니까?

+0

당신이에 밖으로 asciiString를 작성하는 UTF8 인코딩 StreamWriter를 사용하여 시도 되세요 텍스트 파일? 그럴 수 있니? – Task

+0

@ Task : 그의 문제는 그가 8859-1에서 문자열을 얻지 못했고 UTF-8로 저장할 수 없다는 것이 아닙니다. –

+0

오, 그건 완전히 그의 문제입니다. 필자는 Encoding.Convert 호출보다는 StreamReader/StreamWriter 쌍으로 텍스트 변환을 디버깅하는 것이 더 쉽다는 것을 알았습니다. (그래서 in/out 파일을 볼 수 있습니다.) 그건 나 뿐이야. – Task

답변

32

Encoding 개체를 가져와야합니다. ASCII는 이름이 ASCII 인 것과 같습니다. ASCII는 7 비트 ASCII 문자 만 지원합니다. 원하는 파일을 변환하는 것이면 바이트 배열을 직접 처리하는 것보다 쉽습니다. 당신이 바이트 배열을 직접 갖고 싶어

using (System.IO.StreamReader reader = new System.IO.StreamReader(fileName, 
             Encoding.GetEncoding("iso-8859-1"))) 
{ 
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(
              outFileName, Encoding.UTF8)) 
    { 
     writer.Write(reader.ReadToEnd()); 
    } 
} 

그러나, 그것은 Encoding.Convert으로 쉽게 할 충분하다.

byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
    Encoding.UTF8, data); 

그것은 당신이 길을 가고 싶은 경우 다음 이 파일 IO에 대한 StreamReader 같은 인코딩 기반 문자열 리더를 사용하지 않도록 그러나, 여기서주의하는 것이 중요합니다. 파일의 실제 바이트를 읽으므로 FileStream이 더 적합합니다.

완전히 문제를 탐구의 관심,이 같은 것이 작동합니다 :

using (System.IO.FileStream input = new System.IO.FileStream(fileName, 
            System.IO.FileMode.Open, 
            System.IO.FileAccess.Read)) 
{ 
    byte[] buffer = new byte[input.Length]; 

    int readLength = 0; 

    while (readLength < buffer.Length) 
     readLength += input.Read(buffer, readLength, buffer.Length - readLength); 

    byte[] converted = Encoding.Convert(Encoding.GetEncoding("iso-8859-1"), 
         Encoding.UTF8, buffer); 

    using (System.IO.FileStream output = new System.IO.FileStream(outFileName, 
             System.IO.FileMode.Create, 
             System.IO.FileAccess.Write)) 
    { 
     output.Write(converted, 0, converted.Length); 
    } 
} 

을이 예에서 buffer 변수는 그래서 변환이 없다하는 byte[]로 파일의 실제 데이터로 채워집니다 끝난. Encoding.Convert은 소스 및 대상 인코딩을 지정하고 변환 된 바이트를 ... converted이라는 변수에 저장합니다. 그런 다음 출력 파일에 직접 기록됩니다.

내가 말했듯이, StreamReaderStreamWriter을 사용하는 첫 번째 옵션은이 모든 작업을 수행하는 경우 훨씬 간단하지만 후자의 예는 실제로 진행되고있는 작업에 대한 힌트를 더 많이 제공해야합니다. 파일이 (~ 10메가바이트 말), 당신은 두 줄의 코드 만 필요합니다 상대적으로 작은 경우

+0

덕분에 모든 도움과 esp @ Adam 그의 철저한 대답은 – Tim

10

:

string txt = System.IO.File.ReadAllText(inpPath, Encoding.GetEncoding("iso-8859-1")); 
    System.IO.File.WriteAllText(outPath, txt); 
+0

나를 위해 일했다. –

+0

나를 위해. – Cheloide