2012-10-07 6 views
-2

하나 이상의 인코딩이 포함 된 텍스트 파일이 있는데 사용하려는 인코딩 자체가 텍스트 파일에 지정되어 있습니다 (vCard 형식은이를 허용하는 예제입니다) . 다음은 예입니다 :(여러/혼합/두 개 이상) 인코딩을 사용하여 텍스트 파일 읽기

charset=windows-1251: ABCDE 
charset=utf-8: VWXYZ 

... "ABCDE는"인코딩 "창-1251"과 "VWXYZ"로 해석됩니다 UTF8에있을 것입니다. 궁극적으로는 표준 문자열 (C#에서는 UTF2/UTF16)으로 변환해야합니다.

RealAllText()를 사용하려는 이유는 별도로 지정하지 않으면 기본 인코딩이 자동으로 도움이되기 때문입니다. 위와 같이 charset을 지정하면 기본 인코딩이 재정의됩니다.

불행히도 다양한 인코딩을 찾기 위해 일부 텍스트 구문 분석을 수행해야하므로 ReadAllBytes()가 필요할 것이라고 생각하므로 문자를 더 원시 형식으로 파싱 할 수 있습니다.

너무 빠르 길 바랍니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

+0

더 나은 몇 줄의 (16 진수 표기) 샘플을 제공합니다. 이것은 매우 이상한 파일입니다. –

+1

샘플을 제공하는 경우 en/디코딩 프로세스의 정확성을 증명할 수있는 간단한 ASCII 문자뿐만 아니라 인코딩 관련 문자가 포함되어 있는지 확인하십시오. – Oliver

답변

2

인코딩에 대한 모든 메타 데이터가 ASCII로되어 있다고 가정하면 평소처럼 텍스트를 구문 분석 할 수있는 몇 가지 단순한 단일 바이트 기반 인코딩으로 디코딩 할 수 있습니다. 그런 다음 각 문자열을 적절한 인코딩으로 다시 채 웁니다 (바이트에서).

바보 같은 예제 코드 :

var encoding = Encoding.GetEncoding("Windows-1252"); 
string asString = System.IO.File.ReadAllText("C:/Temp/test.txt", encoding); 
byte[] asBytes = System.IO.File.ReadAllText("C:/Temp/test.txt"); 

foreach(var entry in ParseFile(aString)) 
{ 
    int start = entry.PositionInString; 
    // Since we used a one-byte encoding, we can use this location 
    // directly in the byte-array. 

    int length = entry.Length; 
    string encoding = entry.Encoding; 
    string decodedEntry = Encoding.GetEncoding(encoding) 
            .GetString(bytes, start, length); 
    Console.WriteLine(decodedEntry); 
}